1. 程式人生 > >影象灰度變換、二值化、直方圖

影象灰度變換、二值化、直方圖

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

&n