圖像灰度變換、二值化、直方圖


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)

 

尊重原創技術文章,轉載請注明。

https://www.cnblogs.com/pingwen/p/12248360.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM