1、灰度變換
1)灰度圖的線性變換
Gnew = Fa * Gold + Fb。
Fa為斜線的斜率,Fb為y軸上的截距。
Fa>1 輸出圖像的對比度變大,否則變小。
Fa=1 Fb≠0時,圖像的灰度上移或下移,效果為圖像變亮或變暗。
Fa=-1,Fb=255時,發生圖像反轉。
注意:線性變換會出現亮度飽和而丟失細節。
2)對數變換
t=c * log(1+s)
c為變換尺度,s為源灰度,t為變換后的灰度。
對數變換自變量低時曲線斜率高,自變量大時斜率小。所以會放大圖像較暗的部分,壓縮較亮的部分。
3)伽馬變換
y=(x+esp)γ,x與y的范圍是[0,1], esp為補償系數,γ為伽馬系數。
當伽馬系數大於1時,圖像高灰度區域得到增強。
當伽馬系數小於1時,圖像低灰度區域得到增強。
當伽馬系數等於1時,圖像線性變換。
4)圖像取反
方法1:直接取反
imgPath = 'E:\opencv_pic\src_pic\pic2.bmp'; img1 = imread(imgPath); % 前景圖 img0 = 255-img1; % 取反景圖 subplot(1,2,1),imshow(img1),title('原始圖像'); subplot(1,2,2),imshow(img0),title('取反圖像');
方法2:伽馬變換
Matlab:imadjust(f, [low_in, high_in], [low_out, high_out], gamma)
[low_in, high_in]范圍內的數據映射到 [low_out, high_out],低於low的映射到low_out, 高於high的映射到high_out.
imgPath = 'E:\opencv_pic\src_pic\pic2.bmp'; img1 = imread(imgPath); % 前景圖 img0 = imadjust(img1, [0,1], [1,0]); subplot(1,2,1),imshow(img1),title('原始圖像'); subplot(1,2,2),imshow(img0),title('取反圖像');
2、二值化
1)rgb2gray
一般保存的灰度圖是24位的灰度,如果改為8bit灰度圖。則可以用rgb2gray函數。
img= rgb2gray(img);
2)Matlab使用比較運算符二值化
imgPath = 'E:\opencv_pic\src_pic\pic4.bmp'; img = imread(imgPath); % 前景圖 img = rgb2gray(img); img1 = img > 60; img2 = img > 120; img3 = img > 180; subplot(2,2,1),imshow(img), title('原始圖像'); subplot(2,2,2),imshow(img1),title('閾值60'); subplot(2,2,3),imshow(img2),title('閾值120'); subplot(2,2,4),imshow(img3),title('閾值180');
3)imshow參數指定圖像灰度范圍
imshow函數顯示圖片時,可以指定灰度等級。
imshow(img, [100,150])
小於100的直接設置為黑色,大於150的直接設置為白色。二者之間的設置為中等亮度。
imshow(img, [100,101])就可以實現二值化,圖像分界線在100。
imgPath = 'E:\opencv_pic\src_pic\pic4.bmp'; img = imread(imgPath); img= rgb2gray(img); subplot(2,2,1),imshow(img), title('原始圖像'); subplot(2,2,2),imshow(img,[50,100]),title('閾值50-100'); subplot(2,2,3),imshow(img, [100, 150]),title('閾值100-150'); subplot(2,2,4),imshow(img,[200,255]),title('閾值200-255');
3、灰度直方圖
灰度直方圖:橫坐標是灰度,縱坐標是該灰度在圖像中出現的次數。
歸一化直方圖,縱坐標對應着該灰度級別在圖像中出現的概率。
subplot(1,2,1),imshow(img), title('原始圖像'); subplot(1,2,2),imhist(img),title('直方圖');
繪制歸一化直方圖。
subplot(1,2,1),imshow(img), title('原始圖像'); subplot(1,2,2),p = imhist(img)/numel(img) ; plot(p), title('歸一化直方圖');
或者使用stem函數繪制歸一化直方圖。
subplot(1,2,1),imshow(img), title('原始圖像'); [count,x] = imhist(img); [m,n]=size(img); count = count/(m*n); subplot(1,2,2), stem(x, count) , title('歸一化直方圖');
img = img > 100; subplot(1,2,1),imshow(img), title('原始圖像'); subplot(1,2,2),imhist(img), title('直方圖');
把圖片轉換為二值化圖像,直方圖如下。灰度只有0和1,符合二值化圖的特點。
對這個直方圖歸一化,因為是二值化的圖,所以歸一化后就是個子的比例。
p = imhist(img)/numel(img)
p =
0.6980
0.3020
Imhist(img,b); 可以指定灰度等級b,默認是256級,實際工程中一般32級,如下圖。
4、直方圖均衡化
直方圖均衡化即灰度均衡化,通過灰度映射,使輸入圖像的灰度轉換為在每一級灰度上都有近似相同的點數分布,這樣輸出的直方圖就是均勻的,圖像獲得較高的對比度和較大的動態范圍。
直方圖均衡化對圖像進行非線性拉伸,重新分配圖像像素值,使一定灰度范圍內的像素數量大致相同。使用直方圖均衡化技術來處理圖像,能擴展圖像的動態范圍,擴寬灰度等級范圍,提高對比度。
histeq(img,b);%b是灰度等級。2級均衡化就是二值化。
subplot(1,4,1),imshow(img), title('原始圖像'); subplot(1,4,2),histeq(img, 2), title('2級直方圖均衡化'); subplot(1,4,3),histeq(img, 32), title('32級直方圖均衡化'); subplot(1,4,4),histeq(img), title('255級直方圖均衡化');
可見直方圖均衡化之后,圖像亮度變得均勻,提高了對比度。
調用img=img*0.3;調暗了圖像,再次均衡化,圖像的效果沒有發生改變,可見均衡化可以用作圖像處理前把圖像轉為統一的形式。
下圖是imhist(img)之后的直方圖。可見histeq將圖划分灰度等級獲得比較均勻平坦的直方圖。
subplot(1,4,1),imshow(img), title('原始圖像'); subplot(1,4,2),imhist(img), title('原圖直方圖'); subplot(1,4,3),imshow(histeq(img)), title('降低亮度圖后直方圖均衡化'); subplot(1,4,4),imhist(histeq(img)), title('降低亮度直方圖均衡化');
再舉一個例子,直方圖均衡化調整較暗的圖片。
圖片較暗,動態范圍低。直方圖灰度等級偏暗,在高亮度區域分配像素很少。
使用均衡化處理,然后顯示,直方圖各個灰度等級的數據較均勻。
g=histeq(img, 256);
imshow(g)
尊重原創技術文章,轉載請注明。