當前位置:首頁 » 操作系統 » 圖片比較的演算法

圖片比較的演算法

發布時間: 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-09 03:47:03 瀏覽:825
ftp遠程登錄 發布:2024-05-09 03:44:40 瀏覽:226
linuxoracle配置環境變數配置 發布:2024-05-09 03:44:38 瀏覽:498
分類信息網站的源碼 發布:2024-05-09 03:31:18 瀏覽:98
sqlupdate日期 發布:2024-05-09 03:27:14 瀏覽:880
java培訓有人要嗎 發布:2024-05-09 03:21:16 瀏覽:970
c語言多次輸入數據 發布:2024-05-09 03:12:50 瀏覽:738
pythonide使用 發布:2024-05-09 02:56:52 瀏覽:350
社區電商源碼 發布:2024-05-09 02:33:00 瀏覽:150
遼事通登記需要的密碼是什麼 發布:2024-05-09 02:25:45 瀏覽:284