图像灰度变换、二值化、直方图
1、灰度變換
1)灰度圖的線性變換
Gnew = Fa * Gold + Fb。
Fa為斜線的斜率,F(xiàn)b為y軸上的截距。
Fa>1 輸出圖像的對比度變大,否則變小。
Fa=1 Fb≠0時,圖像的灰度上移或下移,效果為圖像變亮或變暗。
Fa=-1,F(xiàn)b=255時,發(fā)生圖像反轉(zhuǎn)。
注意:線性變換會出現(xiàn)亮度飽和而丟失細節(jié)。
2)對數(shù)變換
t=c * log(1+s)
c為變換尺度,s為源灰度,t為變換后的灰度。
對數(shù)變換自變量低時曲線斜率高,自變量大時斜率小。所以會放大圖像較暗的部分,壓縮較亮的部分。
3)伽馬變換
y=(x+esp)γ,x與y的范圍是[0,1], esp為補償系數(shù),γ為伽馬系數(shù)。
當伽馬系數(shù)大于1時,圖像高灰度區(qū)域得到增強。
當伽馬系數(shù)小于1時,圖像低灰度區(qū)域得到增強。
當伽馬系數(shù)等于1時,圖像線性變換。
4)圖像取反
方法1:直接取反
imgPath = 'E:opencv_picsrc_picpic2.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]范圍內(nèi)的數(shù)據(jù)映射到 [low_out, high_out],低于low的映射到low_out, 高于high的映射到high_out.
imgPath = 'E:opencv_picsrc_picpic2.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函數(shù)。
img= rgb2gray(img);
2)Matlab使用比較運算符二值化
imgPath = 'E:opencv_picsrc_picpic4.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參數(shù)指定圖像灰度范圍
imshow函數(shù)顯示圖片時,可以指定灰度等級。
imshow(img, [100,150])
小于100的直接設置為黑色,大于150的直接設置為白色。二者之間的設置為中等亮度。
imshow(img, [100,101])就可以實現(xiàn)二值化,圖像分界線在100。
imgPath = 'E:opencv_picsrc_picpic4.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、灰度直方圖
灰度直方圖:橫坐標是灰度,縱坐標是該灰度在圖像中出現(xiàn)的次數(shù)。
歸一化直方圖,縱坐標對應著該灰度級別在圖像中出現(xiàn)的概率。
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函數(shù)繪制歸一化直方圖。
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('直方圖');
把圖片轉(zhuǎn)換為二值化圖像,直方圖如下。灰度只有0和1,符合二值化圖的特點。
對這個直方圖歸一化,因為是二值化的圖,所以歸一化后就是個子的比例。
p = imhist(img)/numel(img)
p =
0.6980
0.3020
Imhist(img,b); 可以指定灰度等級b,默認是256級,實際工程中一般32級,如下圖。
4、直方圖均衡化
直方圖均衡化即灰度均衡化,通過灰度映射,使輸入圖像的灰度轉(zhuǎn)換為在每一級灰度上都有近似相同的點數(shù)分布,這樣輸出的直方圖就是均勻的,圖像獲得較高的對比度和較大的動態(tài)范圍。
直方圖均衡化對圖像進行非線性拉伸,重新分配圖像像素值,使一定灰度范圍內(nèi)的像素數(shù)量大致相同。使用直方圖均衡化技術來處理圖像,能擴展圖像的動態(tài)范圍,擴寬灰度等級范圍,提高對比度。
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級直方圖均衡化');
可見直方圖均衡化之后,圖像亮度變得均勻,提高了對比度。
調(diào)用img=img*0.3;調(diào)暗了圖像,再次均衡化,圖像的效果沒有發(fā)生改變,可見均衡化可以用作圖像處理前把圖像轉(zhuǎn)為統(tǒng)一的形式。
下圖是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('降低亮度直方圖均衡化');
再舉一個例子,直方圖均衡化調(diào)整較暗的圖片。
圖片較暗,動態(tài)范圍低。直方圖灰度等級偏暗,在高亮度區(qū)域分配像素很少。
使用均衡化處理,然后顯示,直方圖各個灰度等級的數(shù)據(jù)較均勻。
g=histeq(img, 256);
imshow(g)
尊重原創(chuàng)技術文章,轉(zhuǎn)載請注明。
https://www.cnblogs.com/pingwen/p/12248360.html
總結
以上是生活随笔為你收集整理的图像灰度变换、二值化、直方图的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何解决php Snoopy.class
- 下一篇: 小红书七夕笔记还没准备好?这些内容来帮你