將圖片壓縮成灰度圖像的幾種方法:
1.人眼對于彩色的感覺到亮度感覺的轉(zhuǎn)換,這是一個(gè)心理學(xué)問題,有一個(gè)公式:
Grey = 0.299R + 0.587G + 0.114*B
2.直接提取單通道圖
Grey=R or G or B
3.取平均值:
Grey=(R+G+B)/3
圖像預(yù)處理
1.灰度值變換
方法1:線性比例縮放
f(x)=ax+b
當(dāng)|a|>1時(shí),對比度增加,
當(dāng)|a|<0時(shí),對比度減小,若a為負(fù)數(shù)灰度值反轉(zhuǎn)。
當(dāng)b>0時(shí),亮度增加,反之亮度減小
方法2:灰度值直方圖均衡化
使用的前提時(shí)灰度值差異較大
對于一幅圖片,先要統(tǒng)計(jì)他像素中各個(gè)灰度級的出現(xiàn)情況,之后用直方圖來描繪?;叶戎狈綀D描述的時(shí)一個(gè)圖片中某個(gè)灰度在圖片中所占的比例。
灰度直方圖的兩個(gè)峰,數(shù)值大的是前景,數(shù)值小的是背景,中間的是最佳閾值區(qū)間
2.圖像平滑
方法1:

方法2:
高斯濾波:

理想狀態(tài)下的濾波器:1.線性 2.與位置無關(guān) 3.可以控制參數(shù) 4.可以多次執(zhí)行 5.系數(shù)陣旋轉(zhuǎn)對稱
方法3:
中值濾波:這時(shí)一種非線性的濾波,在處理隨機(jī)噪聲上有優(yōu)勢

3.矯正
對圖像進(jìn)行旋轉(zhuǎn)、平移、放大的操作。
二值化應(yīng)用最廣泛的取閾值點(diǎn)方法
最大類間方差法(otus大津法):
適合用于雙峰圖,最小峰是前景,最大峰值時(shí)背景,中間值為最佳閾值區(qū)間。假設(shè)有一個(gè)點(diǎn)可以正好把一幅圖分為兩大類,這兩大類的均值為m1與m2假設(shè)的最優(yōu)點(diǎn)為mg,p1、p2表示的時(shí)前景背景所占的比例,默認(rèn)為1:1。目的就是找到最大的方差σ,因?yàn)榉讲畋硎镜氖请x散程度,找到一個(gè)分類點(diǎn)使得離散程度最高,就可以成功分離開前景和背景。

opencv實(shí)現(xiàn)
參數(shù)說明
src:源圖像,可以為8位的灰度圖,也可以為32位的彩色圖像。(兩者由區(qū)別)
dst:輸出圖像
thresh:閾值
maxval:dst圖像中最大值
type:閾值類型,可以具體類型如下:

雙閾值分割可以用兩次單閾值分割疊加:
threshold(img2, out1, 50, 255, THRESH_BINARY); //大閾值對源灰度圖像進(jìn)行反二進(jìn)制閾值化操作 threshold(img2, out2,140, 255, THRESH_BINARY_INV);//thresh:閾值,maxval:輸出圖像中最大值 bitwise_and(out1, out2, img2); //對像素加和
特征提取
區(qū)域特征
從區(qū)域自身提取來的特征
最簡單的方法是計(jì)算區(qū)域的面積,其可以用計(jì)算區(qū)域內(nèi)點(diǎn)的個(gè)數(shù)來代替
行程編碼
在一個(gè)聯(lián)通的二值圖中,把圖像轉(zhuǎn)換成矩陣后,每一行只存儲(chǔ)連續(xù)點(diǎn)的開頭元素位置和結(jié)尾元素位置
有一個(gè)字符串“aaabccddddd”,經(jīng)過行程 編碼后可以用“3a1b2c5d
灰度圖的方差:可以判斷圖片是否模糊(要規(guī)定感受野的)
灰度圖的亮度:來描述圖片的連讀
幾何不變矩
矩是對變量分布和形態(tài)分布的一組度量,n階矩被定義為一變量的n次方與其概率密度函數(shù)之積的積分

變量的一階原始矩等價(jià)于[數(shù)學(xué)期望]、二至四階中心矩被定義為[方差]、[偏度]



HU不變矩具有平移旋轉(zhuǎn)和尺度不變性,這里表述的數(shù)域轉(zhuǎn)移到了二維


形態(tài)學(xué)
六種基本操作
1.閔科夫斯基加法
在結(jié)構(gòu)元上定義一個(gè)中心點(diǎn),把這個(gè)結(jié)構(gòu)元當(dāng)刷子以中心點(diǎn)為基準(zhǔn)遍歷目標(biāo),目標(biāo)沒有的點(diǎn)就加上去。


2.膨脹:
對結(jié)構(gòu)元先進(jìn)行對稱再進(jìn)行閔可夫斯基加法,因?yàn)榻Y(jié)構(gòu)元大多數(shù)是中心對稱的,所以一般不區(qū)分膨脹和閔可夫斯基加法。
3.閔科夫斯基減法:
膨脹的對偶運(yùn)算


4.腐蝕:閔可夫斯基加法的對偶
5.閉運(yùn)算
先膨脹后腐蝕
閉運(yùn)算
閉運(yùn)算的效果圖如下圖所示:
我們也可以得到關(guān)于閉運(yùn)算的幾點(diǎn)結(jié)論:
(1)閉運(yùn)算能夠填平小湖(即小孔),彌合小裂縫,而總的位置和形狀不變。
(2)閉運(yùn)算是通過填充圖像的凹角來濾波圖像的。
(3)結(jié)構(gòu)元素大小的不同將導(dǎo)致濾波效果的不同。
(4)不同結(jié)構(gòu)元素的選擇導(dǎo)致了不同的分割。
6.開運(yùn)算
先腐蝕后膨脹
開運(yùn)算的效果圖如下圖所示:
我們可以得到關(guān)于開運(yùn)算的幾點(diǎn)結(jié)論:
(1)開運(yùn)算能夠除去孤立的小點(diǎn),毛刺和小橋,而總的位置和形狀不便。
(2)開運(yùn)算是一個(gè)基于幾何運(yùn)算的濾波器。
(3)結(jié)構(gòu)元素大小的不同將導(dǎo)致濾波效果的不同。
(4)不同的結(jié)構(gòu)元素的選擇導(dǎo)致了不同的分割,即提取出不同的特征。
邊界提取的原理:
通過對目標(biāo)圖像進(jìn)行腐蝕和膨脹處理,比較結(jié)果圖像與原圖像的差別來實(shí)現(xiàn)。
內(nèi)邊界的提取利用圖像的腐蝕處理得到原圖像的一個(gè)收縮,再將收縮結(jié)果與目標(biāo)圖像進(jìn)行異或運(yùn)算,實(shí)現(xiàn)差值部分的提取,
外邊界提取先對圖像進(jìn)行膨脹處理,然后用膨脹結(jié)果與原目標(biāo)圖像進(jìn)行異或運(yùn)算,也就是求膨脹結(jié)果與原目標(biāo)圖像的差集
關(guān)鍵就是找到合適的結(jié)構(gòu)元
一些基本術(shù)語
刷子:用來處理對象的圖像,通常是較小的,相當(dāng)于濾波器、窗口
擊中:兩個(gè)對象有交集
對稱:一般是關(guān)于某一個(gè)點(diǎn)的旋轉(zhuǎn)對稱
邊緣檢測
定義:
邊緣:局部差異性強(qiáng),一定不是閉合的
邊界:一定是閉合的
輪廓:是在大尺度,在δ比較大的情況下,全局來看,也不一定是閉合的
邊緣的分類:
階梯狀邊緣:圖像灰度值不同的相鄰區(qū)間內(nèi)
脈沖狀邊緣:在該處圖像的灰度值會(huì)有突增
屋頂狀邊緣:灰度值的上升和下降都比較平滑,這三類邊緣的檢測是越來越難的

梯度
對梯度的定義可以有很多,梯度反映的圖像在該點(diǎn),增加最快的方向??梢杂锰荻染植康淖畲笾祦硪?guī)定邊緣。

算子
定義:
廣義算子就是一個(gè)映射,一維中可以由一個(gè)數(shù)變成另一個(gè)數(shù),就是一個(gè)函數(shù);二維中可以把一個(gè)矩陣轉(zhuǎn)換成另一個(gè)矩陣、或者壓縮到一維下的
另一個(gè)數(shù)值
狹義的算子是函數(shù)到函數(shù)
泛函是函數(shù)到數(shù)字

像是羅伯特算子適合一個(gè)傾斜45,135的階梯、脈沖邊緣,普瑞維特算子適合橫豎的邊緣。
幾種常見的二階算子(大部分奇數(shù)規(guī)模)
首先模板基本要求是核為正數(shù),所有系數(shù)的和為0,如拉普拉斯算子:

canny邊緣檢測步驟
1.先要進(jìn)行降噪,對圖像進(jìn)行個(gè)平滑處理,這里選取的是五階的高斯平滑算子
2.剛才的sobel算子,來計(jì)算梯度的幅值和方向

3.非極大值抑制:再池化一次,將邊緣描述成少像素的細(xì)線條
4.滯后閾值: 滯后閾值需要兩個(gè)閾值(高閾值和低閾值):
如果某一像素位置的幅值超過 高 閾值, 該像素被保留為邊緣像素。
如果某一像素位置的幅值小于 低 閾值, 該像素被排除。
如果某一像素位置的幅值在兩個(gè)閾值之間,該像素僅僅在連接到一個(gè)高于 高 閾值的像素時(shí)被保留。
Canny 推薦的 高:低 閾值比在 2:1 到3:1之間。
cvtColor(srcImage, srcGray, CV_BGR2GRAY);//灰度化
GaussianBlur(srcGray, srcGray, Size(3,3),1, 1);//高斯, 120, 255
//blur(srcGray, srcGray, Size(3, 3));
imshow("GaussianBlur", srcGray);
//Canny檢測
int edgeThresh = 80;
Mat Canny_result;
Canny(srcGray, Canny_result, 120, 250,3);
imshow("Canny_result", Canny_result);
waitKey(0);

我考慮了用膨脹和腐蝕去點(diǎn)條形碼,效果一般
Mat element1 = getStructuringElement(MORPH_CROSS, Size(5, 5));
Mat element2 = getStructuringElement(MORPH_CROSS, Size(6, 6));
Mat element3 = getStructuringElement(MORPH_CROSS, Size(2, 2));
dilate(Canny_result, Canny_result, element1);
erode(Canny_result, Canny_result, element2);
dilate(Canny_result, Canny_result, element1);
erode(Canny_result, Canny_result, element3);
erode(Canny_result, Canny_result, element3);
dilate(Canny_result, Canny_result, element3);

LBP提取紋理(不受光照影響)
LBPH(Local Binary Pattern Histogram) 局部二值模式直方圖,是一種用來描述圖像局部紋理特征的算子;它具有旋轉(zhuǎn)不變性和灰度不變性等顯著的優(yōu)點(diǎn),原始的LBP算子定義為在33的窗口內(nèi),以窗口中心像素為閾值,將相鄰的8個(gè)像素的灰度值與其進(jìn)行比較,若周圍像素值大于中心像素值,則該像素點(diǎn)的位置被標(biāo)記為1,否則為0。這樣,33鄰域內(nèi)的8個(gè)點(diǎn)經(jīng)比較可產(chǎn)生8位二進(jìn)制數(shù)(通常轉(zhuǎn)換為十進(jìn)制數(shù)即LBP碼,共256種),即得到該窗口中心像素點(diǎn)的LBP值,并用這個(gè)值來反映該區(qū)域的紋理信息。LBP算法可以很好的提取圖片局部的紋理特征,由于其選擇的是閾值函數(shù), LBP算法收光照影響不明顯。

void LBP(IplImage* src, IplImage* dst)
{
int width = src->width;
int height = src->height;
for (int j = 1; j < width - 1; j++)
{
for (int i = 1; i < height - 1; i++)
{
uchar neighborhood[8] = { 0 };
neighborhood[7] = CV_IMAGE_ELEM(src, uchar, i - 1, j - 1);
neighborhood[6] = CV_IMAGE_ELEM(src, uchar, i - 1, j);
neighborhood[5] = CV_IMAGE_ELEM(src, uchar, i - 1, j + 1);
neighborhood[4] = CV_IMAGE_ELEM(src, uchar, i, j - 1);
neighborhood[3] = CV_IMAGE_ELEM(src, uchar, i, j + 1);
neighborhood[2] = CV_IMAGE_ELEM(src, uchar, i + 1, j - 1);
neighborhood[1] = CV_IMAGE_ELEM(src, uchar, i + 1, j);
neighborhood[0] = CV_IMAGE_ELEM(src, uchar, i + 1, j + 1);
uchar center = CV_IMAGE_ELEM(src, uchar, i, j);
uchar temp = 0;
for (int k = 0; k < 8; k++)
{
temp += (neighborhood[k] >= center) << k;
}
CV_IMAGE_ELEM(dst, uchar, i, j) = temp;
}
}
}

