圖片比較演算法
A. 圖像二值化的演算法比較
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;
}
}
B. 圖像比對的原理或者演算法
有雜訊情況下。1、配准;2、兩張圖的圖像塊分別計算特徵(lbp,sift等);3、計算特徵的距離(歐式距離等)。在matlab或opencv下都可以。
C. java 對比圖片相似度的演算法。。說說想法也行
每張圖分成四塊,將每部分的圖片混成一種純色,對比這四個純色可以篩掉大部分的圖片
D. 圖像演算法A和B兩張圖片,找出B與A不同的部分
說的很清楚,你也把思路說出來了,就是這樣的,加快網路的傳輸速度。
至於比較方法,比較像素點的方向是對的,不過我想它不是上來就比較像素點,因為這樣效率較低,而是採用的多函數嵌套,方法如下:
把圖片分成幾大塊,比如平均分4塊,然後每一塊進行比對(進行圖片的模糊匹配,而不是精確的像素匹配),找出不同大塊,然後再分塊,以此下去,找到比較小的塊(這個根據編程定義到底多小算小),然後再進行像素比對,這樣效率能夠更加提高。
E. 實現圖片對比度和亮度的演算法是什麼
亮度就是一幅照片中的黑白灰分布情況,對比度是亮部和暗部的差距,飽和度就是顏色純度
F. 圖像識別演算法都有哪些
圖像識別,是指利用計算機對圖像進行處理、分析和理解,以識別各種不同模式的目標和對像的技術。一般工業使用中,採用工業相機拍攝圖片,然後再利用軟體根據圖片灰階差做進一步識別處理,圖像識別軟體國外代表的有康耐視等,國內代表的有圖智能等。另外在地理學中指將遙感圖像進行分類的技術。
G. 有什麼可以對比兩張圖片得出相似度的軟體。
呵呵,這個軟體我還真有,DuplicatePhotoFinder-這個軟體不旦可以找相同圖片還可以找相似圖片的軟體喲
名字不一樣,大小不一樣都能找得出來。只要內容相同或相似!我經常用這個軟體清理我的圖片
H. 求圖像做差演算法,高分,可以現金。
別試了,無效。我的演算法和您的問題完全不相干,您需要實現這樣的高級功能只能找公司付錢做。以目前還很淺顯的知識來看,我覺得這種問題是非常難解決的,因為你要尋求的不同區域只有微小的變化。沒能幫助您,很抱歉。
I. 比較圖片中人臉的相似程度是使用什麼樣的演算法,並且計算得到眼睛,鼻子等相似程度有沒有具體的實現
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就是人臉在圖片中的位置了。