欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

灰度变换(一)

程序员文章站 2022-05-30 09:22:08
...

灰度变换基本函数

工作需要,最近在学习数字图像处理,权当就是一个记录了,把书上的例子自己实现一下加深理解,代码若有问题也欢迎大佬指定。
会根据自己的学习进度一点点进行更新,最理想情况当然是把学到的知识点都实现一下(当然这比较困难),尽量坚持下去吧,程序都是用matlab写的。源图片的链接如下:

链接:https://pan.baidu.com/s/16hazkEVVBsewzzH68YrbLg
提取码:zdvv

1、图像反转

根据公式 : s=L1r s = L - 1 - r
变换前的图片如下所示
灰度变换(一)

f = imread("CH03\1.tif") ;  %read the image 
imshow(f); % show the image 
saveas(gcf , 'reverse1.jpg')
f1 = imadjust(f , [0 , 1] , [1, 0] ,1) ; % reverse the intensity
figure ;
imshow(f1); % compare
saveas(gcf , 'reverse2.jpg')

变换结果如下 :
灰度变换(一)

2、gamma变换

gamma变化的特点如下图所示,可以看出不同gamma值对暗部或者亮部有着压缩或者扩展的效果。
灰度变换(一)
下面两幅图片的分别属于过暗和过亮的情况
灰度变换(一)
灰度变换(一)

gamma1=imread("CH03\gamma1.tif");
imshow(gamma1)
title("gamma1")
gamma1_trans = imadjust(gamma1,[],[],3); %change gamma value
figure ; 
imshow(gamma1_trans)
title("gamma1 = 3 ")

gamma2=imread("CH03\gamma2.tif");
figure;
imshow(gamma2)
title("gamma2")
saveas(gcf , 'gamma2.jpg')
gamma2_trans = imadjust(gamma2,[],[],0.3); %change gamma value
figure ; 
imshow(gamma2_trans)
title("gamma2 = 0.3 ")
saveas(gcf , 'gamma21.jpg')

gamma3=imread("CH03\gamma3.tif");
figure;
imshow(gamma3)
title("gamma3")
saveas(gcf , 'gamma3.jpg')
gamma3_trans = imadjust(gamma3,[],[],4); %change gamma value
figure ; 
imshow(gamma3_trans)
title("gamma3 = 4 ")
saveas(gcf , 'gamma31.jpg')

经过gamma变换后:
灰度变换(一)
灰度变换(一)

3、分段线性

处理前图片:
灰度变换(一)
图片的灰度值集中在某一段区间内,分别对其采用了阈值二值化处理和分段线性变换(变换曲线的斜率没有严格计算)

clc ;
clear ;
img1 = imread("CH03\piece1.tif") ;
imshow(img1)
title("initial")
saveas(gcf , 'piece1.jpg')
% thresholding process 
low = find(img1 < 110 ); % 
img2 = 255*ones(500) ;
img2(low) = 0 ;
figure 
imshow(img2)
title("thresholding")
saveas(gcf , 'piece2.jpg')
% piecewise linear process
pie1 = find(img1 <= 95) ; 
pie2 = find(img1 >95 & img1 <120)  ;
pie3 = find(img1 >= 120) ;
img3 = img1 ;
img3(pie1) = 0.7*img3(pie1) ;
img3(pie3) = (img3(pie3) - 115 )*0.7 + 190 ;
img3(pie2) = (img3(pie2)-95)*5 +70 ; 
figure ;
imshow(img3)
title("piecewise linear")
saveas(gcf , 'piece3.jpg')

处理后:
灰度变换(一)
灰度变换(一)

4、比特分层

就是将图像灰度值按每一位的0或1进行分层,8bit图像即可分为8层,越高位对灰度影响越大,因此反映整体,越低越反映细节。分层前:
灰度变换(一)

clc ;
clear  ;
close all;
img= imread("CH03\bit.tif") ;
imshow(img)
title("bit all")
saveas(gcf,'bitall.jpg')
imgbit = zeros(596000,8);

for i = 1:1:8
    bit = find(bitget(img,i)); % get the value of bit i 
    imgbit(bit,i) = 1 ; 
end
imgbit = reshape(imgbit,[500,1192,8]);
% 1 bit plane
figure;
imshow(imgbit(:,:,1))
title('bit1')
saveas(gcf ,'bit1.jpg')
% 2 bit plane
figure;
imshow(imgbit(:,:,2))
% 3 bit plane
figure;
imshow(imgbit(:,:,3))
% 4 bit plane
figure;
imshow(imgbit(:,:,4))
% 5 bit plane
figure;
imshow(imgbit(:,:,5))
% 6 bit plane
figure;
imshow(imgbit(:,:,6))
% 7 bit plane
figure;
imshow(imgbit(:,:,7))
% 8 bit plane
figure;
imshow(imgbit(:,:,8))
title('bit8')
saveas(gcf ,'bit8.jpg')

img_rb = imgbit(:,:,8)*128 + imgbit(:,:,7)*64 +  imgbit(:,:,6)*32 + imgbit(:,:,5)*16 ;
figure
imshow(img_rb,[0,255])
title('bit5678')
saveas(gcf ,'bit5678.jpg')
img_rb2 = imgbit(:,:,8)*128 + imgbit(:,:,7)*64   ;
imshow(img_rb2,[0,255])
title('bit78')
saveas(gcf ,'bit78.jpg')

分层后的第一位和第八位分层图:
灰度变换(一)
灰度变换(一)
分别将78位和5678位合成重建
灰度变换(一)
灰度变换(一)
根据高四位合成的图像与原图已经十分相似,在图像压缩中比特分层就有应用。

推荐国漫风雨廊桥和望古神话之天选者,学习之余也要放松

相关标签: 图像处理 matlab