当前位置:首页 » 操作系统 » 图片比较的算法

图片比较的算法

发布时间: 2022-12-06 10:44:23

Ⅰ OpenCV实现的SSIM算法 (用作图片对比自动化测试)

opencv4nodejs 安装
安装opencv4nodejs仅需

·安装cmake并配置环境变量
cmake 安装 cmake.org/download/
·安装git并配置环境变量

export OPENCV4NODEJS_DISABLE_AUTOBUILD=1

set OPENCV4NODEJS_DISABLE_AUTOBUILD=1
·npm install --global windows-build-tools

·npm install --save opencv4nodejs

Ⅱ 寻找一个可以查找两张相似图片不同之处的软件

Beyond Compare 比较图片的发方法:

步骤一 打开Beyond Compare,选择左边的“图片比较”,右键选择“打开”,打开图片比较会话框;

步骤二 在打开文件的地方浏览打开两个一样的、格式不同的图片;

步骤三 点击“容差”选项,在下面的黑白图片处左右拖动,使两张图片尽量重合,蓝色的即为相同的地方,红色的为不同之处,这样我们可以看见两张图片之间的差异;

步骤四 点击“范围”按钮,打开不匹配范围模式,查找我们需要的图片差异。

Ⅲ C#灰度图像通过相似度算法找出相似度最高的图片

这种以图搜图可以用感知哈希算法,


第一步 缩小图片尺寸

将图片缩小到8x8的尺寸, 总共64个像素. 这一步的作用是去除各种图片尺寸和图片比例的差异, 只保留结构、明暗等基本信息.

第二步 转为灰度图片

将缩小后的图片, 转为64级灰度图片.

第三步 计算灰度平均值

计算图片中所有像素的灰度平均值

第四步 比较像素的灰度

将每个像素的灰度与平均值进行比较, 如果大于或等于平均值记为1, 小于平均值记为0.

第五步 计算哈希值

将上一步的比较结果, 组合在一起, 就构成了一个64位的二进制整数, 这就是这张图片的指纹.

第六步 对比图片指纹

得到图片的指纹后, 就可以对比不同的图片的指纹, 计算出64位中有多少位是不一样的. 如果不相同的数据位数不超过5, 就说明两张图片很相似, 如果大于10, 说明它们是两张不同的图片.

具体的c#代码可以看

usingSystem;
usingSystem.IO;
usingSystem.Drawing;

namespaceSimilarPhoto
{
classSimilarPhoto
{
ImageSourceImg;

publicSimilarPhoto(stringfilePath)
{
SourceImg=Image.FromFile(filePath);
}

publicSimilarPhoto(Streamstream)
{
SourceImg=Image.FromStream(stream);
}

publicStringGetHash()
{
Imageimage=ReceSize();
Byte[]grayValues=ReceColor(image);
Byteaverage=CalcAverage(grayValues);
Stringreslut=ComputeBits(grayValues,average);
returnreslut;
}

//Step1:Recesizeto8*8
privateImageReceSize(intwidth=8,intheight=8)
{
Imageimage=SourceImg.GetThumbnailImage(width,height,()=>{returnfalse;},IntPtr.Zero);
returnimage;
}

//Step2:ReceColor
privateByte[]ReceColor(Imageimage)
{
BitmapbitMap=newBitmap(image);
Byte[]grayValues=newByte[image.Width*image.Height];

for(intx=0;x<image.Width;x++)
for(inty=0;y<image.Height;y++)
{
Colorcolor=bitMap.GetPixel(x,y);
bytegrayValue=(byte)((color.R*30+color.G*59+color.B*11)/100);
grayValues[x*image.Width+y]=grayValue;
}
returngrayValues;
}

//Step3:Averagethecolors
privateByteCalcAverage(byte[]values)
{
intsum=0;
for(inti=0;i<values.Length;i++)
sum+=(int)values[i];
returnConvert.ToByte(sum/values.Length);
}

//Step4:Computethebits
privateStringComputeBits(byte[]values,byteaverageValue)
{
char[]result=newchar[values.Length];
for(inti=0;i<values.Length;i++)
{
if(values[i]<averageValue)
result[i]='0';
else
result[i]='1';
}
returnnewString(result);
}

//Comparehash
(stringa,stringb)
{
if(a.Length!=b.Length)
thrownewArgumentException();
intcount=0;
for(inti=0;i<a.Length;i++)
{
if(a[i]!=b[i])
count++;
}
returncount;
}
}
}

Ⅳ 有什么可以对比两张图片得出相似度的软件。

呵呵,这个软件我还真有,DuplicatePhotoFinder-这个软件不旦可以找相同图片还可以找相似图片的软件哟
名字不一样,大小不一样都能找得出来。只要内容相同或相似!我经常用这个软件清理我的图片

Ⅳ 图像比对的原理或者算法

有噪声情况下。1、配准;2、两张图的图像块分别计算特征(lbp,sift等);3、计算特征的距离(欧式距离等)。在matlab或opencv下都可以。

Ⅵ 图像处理-自动对比度

直方图 能够反映一张图片的曝光分布趋势信息,更是一个图片信息直观反馈的方式。我们能通过原图展示出对应的直方图,更能够根据直方图处理处效果更好的图片。

RGB直方图

色彩空间加法三原色RGB, 色彩空间的概念 ,整张图片每个像素点的RGB均值的结果展示;上图表示图中无黑色和白色,最左端有像素也并不能说明有纯黑色,而是有一个通道分量为0。

在摄影师的眼中,如何上图右边的区域都没有像素值则表示这张图欠曝~

单通道直方图

单通道则是根据不同的原色进行划分的通道,R/G/B 其三者相加最后得到RGB直方图。

明度直方图

是复合计算单个像素之后绘制的直方图。

颜色直方图

红色+绿色 = 黄色

绿色+蓝色 = 青色

红色+蓝色 = 洋红色

红色+绿色+蓝色 = 灰色

如果没有叠加,那就是自身的颜色。

平均值 图像的平均值亮度,根据它来判断画面整体的曝光情况,128为中间值,比128低说明偏暗、否则偏亮。(相对客观值)

性质

色阶 就是用直方图描述出的整张图片的明暗信息,可以对 RGBA 四个通道进行调整,也可以进行整体调整。
在图像处理中,调节色阶(level)实质就是通过调节直方图来调节不同像素值的大小来改进图像的直观效果。

增强对比度

原理:直方图均衡化

自动对比度调整,主要作用是把一定范围内的像素值,近似映射到整个图像灰度范围内。比如对于每个像素都是8Bit的图像而言,整个灰度范围即为[0,255]。实现方式是把一定范围内的像素灰度最小值映射到整个图像所能表示灰度值的最小值,把范围内的最大值灰度映射到整幅图像所能表示灰度值的最大值。

延伸出 我们能够根据直方图进行一套自动化处理,增强图片的效果,提高图片质感。

参考

openCV实现

自动对比度算法

Ⅶ 图像二值化的算法比较

OTSU的中心思想是阈值T应使目标与背景两类的类间方差最大。
//用类间方差最大思想计算阈值
int Threshold(int *hist) //compute the threshold
{
float u0, u1;
float w0, w1;
int count0;
int t, maxT;
float devi, maxDevi = 0; //方差及最大方差
int i;
int sum = 0;
for (i = 0; i < 256; i++)
{
sum = sum + hist[i];
}
for (t = 0; t < 255; t++)
{
u0 = 0; count0 = 0;
//阈值为t时,c0组的均值及产生的概率
for (i = 0; i <= t; i++)
{
u0 += i * hist[i]; count0 += hist[i];
}
u0 = u0 / count0; w0 = (float)count0/sum;
//阈值为t时,c1组的均值及产生的概率
u1 = 0;
for (i = t + 1; i < 256; i++)
{
u1 += i * hist[i];
}
u1 = u1 / (sum - count0); w1 = 1 - w0;
//两类间方差
devi = w0 * w1 * (u1 - u0) * (u1 - u0);
//记录最大的方差及最佳位置
if (devi > maxDevi)
{
maxDevi = devi;
maxT = t;
}
}
return maxT;
}
//二值化处理
void OTSU(IplImage *src, IplImage *dst)
{
int i = 0, j = 0;
int wide = src->widthStep;
int high = src->height;
int hist[256] = {0};
int t;
unsigned char *p, *q;
for (j = 0; j < high; j ++)
{
p = (unsigned char *)(src->imageData + j * wide);
for (i = 0; i < wide; i++)
{
hist[p[i]]++; //统计直方图
}
}
t = Threshold(hist);
for (j = 0; j < high; j ++)
{
q = (unsigned char *)(dst->imageData + j * wide);
p = (unsigned char *)(src->imageData + j * wide);
for (i = 0; i < wide; i++)
{
q[i] = p[i] >= t ? 255 : 0;
}
}
}
OTSU算法对不均匀光照的图片不能产生很好的效果。 另外一个Kittler算法,是一种快速的全局阈值法。它的效果不比OTSU差多少,但速度快好多倍,如果可以应用在图像质量不错的环境。
它的中心思想是,计算整幅图像的梯度灰度的平均值,以此平均值做为阈值。
//kittler算法
for (i=1;i<high-1;i++)
{
plineadd=src->imageData+i*wide;
pNextLine=src->imageData+(i+1)*wide;
pPreLine=src->imageData+(i-1)*wide;
for(j=1;j<wide-1;j++)
{
//求水平或垂直方向的最大梯度
Grads=MAX(abs((uchar)pPreLine[j]-(uchar)pNextLine[j]),abs((uchar)plineadd[j-1]-(uchar)plineadd[j+1])); //max(xGrads,yGrads)
sumGrads += Grads;
//梯度与当前点灰度的积
sumGrayGrads += Grads*((uchar)plineadd[j]);
}
}
threshold=sumGrayGrads/sumGrads;
// printf(%d ,threshold);
for(i=0;i<high;i++)
{
plineadd=src->imageData+i*wide;
pTempLine=kittler->imageData+i*wide;
for(j=0;j<wide;j++)
{
pTempLine[j]=(uchar)plineadd[j]>threshold?255:0;
}
}

java 对比图片相似度的算法。。说说想法也行

每张图分成四块,将每部分的图片混成一种纯色,对比这四个纯色可以筛掉大部分的图片

Ⅸ 比较图片中人脸的相似程度是使用什么样的算法,并且计算得到眼睛,鼻子等相似程度有没有具体的实现

OPENCV里就有。安装后,DATA目录下,haarcascades目录下,haarcascade_frontalface_default.xml就不错。这是人脸识别的数据。
用法请根据这个文件名找吧,记得就是调用OPENCV里的某个函数(C++),用这个文件名和图作参数,返回的就是图中人脸的位置。
这里是你用得着的部分:
const char* cascadeFile = "haarcascade_frontalface_alt.xml";
const char* folder = "C:\\Program Files\\OpenCV\\data\\haarcascades\\";
char path[1024];
sprintf(path, "%s%s", folder, cascadeFile);
CvHaarClassifierCascade* cascade = (CvHaarClassifierCascade*) cvLoad(path, 0, 0, 0);
//然后cascade就存着需要的那个CvHaarClassifierCascade了。
......
CvSeq* faces = cvHaarDetectObjects(img, cascade, storage,
1.1, 2, CV_HAAR_DO_CANNY_PRUNING,
cvSize(source->getWidth() >> 7, source->getHeight() >> 7));
这句中,img是一个IplImage*,我自己的项目是从摄像头弄来的,我估计你需要直接用opencv载入图片。cascade就是载入的OPENCV的样本数据,storage是一个空间,我用的CvMemStorage* storage = cvCreateMemStorage(0)创建的,detect objects之前我还用了cvClearMemStorage(storage),1.1是缩放,2是检测像素大小,CV_HAAR_DO_CANNY_PRUNING是比较方法, 一个OPENCV自带的常量。最后cvSize的返回值是允许的最小脸部大小。每个变量都解释到了吧。
之后faces->total就是找到几个脸。用cvGetSeqElem(faces, i)来取每个脸的数据,取出来的东西是(CvRect*),要记得TYPECAST,例如CvRect face1 = *((CvRect*) cvGetSeqElem(faces, 0))。这样得到的CvRect有4个变量face1.x,face1.y,face1.width,face1.height就是人脸在图片中的位置了。

Ⅹ 如何计算图片大小

根据像素计算大小。

原始图像大小可以如此估算:水平像素*垂直像素*1色黑白或3基色*一种颜色深度bit数/8/1024/1024=MB数比如1024*1024的24位彩色bmp=1024*1024*(3*8)/8/1024/1024=3MB。

(10)图片比较的算法扩展阅读:

图片越小压缩率越小,并逐渐趋向当前质量的最小压缩率,图片越大压缩率越大,并逐渐趋于当前质量的最大压缩率,图片非常小时有可能比1还小;

品质越低压缩率越高,0级时一般会在200:1到30:1间浮动,大多集中在60:1附近;8级时一般会在40:1到4:1间浮动,大多集中在16:1;11级时一般会在16:1到2:1间浮动,大多集中在7:1附近;

色彩分布越趋向于单色、连续颜色、重复色块时压缩比越高,极端时(比如纯白的图),就算图片很大,图片也只会有几百字节到几十K字节。

热点内容
我的世界创造房子服务器 发布:2024-05-20 06:48:36 浏览:818
小米笔记本存储不够 发布:2024-05-20 06:32:53 浏览:784
dirt5需要什么配置 发布:2024-05-20 06:02:58 浏览:543
怎么把电脑锁上密码 发布:2024-05-20 05:19:09 浏览:985
安卓为什么连上wifi后没有网络 发布:2024-05-20 05:17:50 浏览:419
安卓usb在设置哪里 发布:2024-05-20 05:03:03 浏览:187
绥化编程 发布:2024-05-20 04:59:44 浏览:991
基本原理和从头计算法 发布:2024-05-20 04:50:32 浏览:30
配置情况指的是什么 发布:2024-05-20 04:48:14 浏览:497
那个程序用来编译源文件 发布:2024-05-20 04:46:45 浏览:551