1.图像灰度修正。测试图像pout.tif、tire.tif。读入灰度级分布不协调的图像,分析其直方图。根据直方图设计灰度变换表达式,调整表达式的参数,直到显示图像的直方图均衡为止。
2.不均匀光照的校正。测试图像pout.tif,采用分块处理函数blkproc和图像相减函数imsubtract对图像不均匀光照进行校正;
3、三段线性变换增强。测试图像couple.tif。选择合适的转折点,编程对图像进行三段线性变换增强。
4、图像平滑方法。测试图像为eight.tif。对测试图像人为加噪后进行平滑处理。根据噪声的不同,选择不同的去噪方法。
5、图像锐化方法。测试图像为rice.tif、cameraman.tif。读入一副边缘模糊的图像,利用罗伯茨梯度对图像进行4种锐化处理,比较各自的效果。
(灰度修正、不均匀光照的校正、三段线性变换增强、图像平滑方法、图像锐化方法)
目录
本文章包含以下内容:
目录:
全部代码如下:
结果如下:
下面这些是代码里的各个部分,方便复制
灰度修正:
不均匀光照的校正:
三段线性变换增强:
图像平滑方法:
图像锐化方法:
可以放到同一个文件里,如果缺少图片,在这里有:(记着改后缀)
couple.tif
rice.tif
function U()
clear;
clc;
Gray_correction()
Gray_level_correction()
Piecewise_linear_transformation()
Image_smoothing()
Image_Sharpening()
end
% 灰度修正函数,对pout.tif和tire.tif处理
function Gray_correction()
img_p = imread('pout.tif'); % 读取文件
img_t = imread('tire.tif'); % 读取文件
figure('Name','灰度修正'); % 开一个叫灰度修正的窗口
% pout.tif
subplot(2,5, 1);imshow(img_p);title('pout.tif原图'); % 显示原图
subplot(2,5, 2);imhist(img_p);title('pout.tif直方图'); % 显示直方图
max_p = double(max(img_p(:))); % 得到像素最大值
min_p = double(min(img_p(:))); % 得到像素最小值
subplot(2,5, 3);plot([min_p,max_p],[0,255]);
axis([0 255 0 255]);title('线性变换函数'); %显示线性变换函数
img2_p = imadjust(img_p,[min_p/255,max_p/255],[]);
subplot(2,5, 4);imhist(img2_p);title('pout.tif变换后直方图'); % 显示变换后直方图
subplot(2,5, 5);imshow(img2_p);title('pout.tif变换后图像'); % 显示变换后图像
% tire.tif
subplot(2,5, 6);imshow(img_t);title('tire.tif原图'); % 显示原图
subplot(2,5, 7);imhist(img_t);title('tire.tif直方图'); % 显示直方图
m_t = double(median(img_t(:))); % 中位数
k1 = 128/m_t; % 第一根线的k
k2 = 128/(255 - m_t); % 第二根线的k
subplot(2,5, 8);plot([0,m_t,255],[0,128,255]);
axis([0 255 0 255]);title('线性变换函数'); %显示线性变换函数
img2_t = (img_t*k1).*uint8(img_t<=m_t)+(img_t*k2+(255*(1-k2))).*uint8(img_t>m_t);
subplot(2,5, 9);imhist(img2_t);title('tire.tif变换后直方图'); %显示变换后直方图
subplot(2,5,10);imshow(img2_t);title('tire.tif变换后图像'); %显示变换后图像
end
% 对pout.tif进行不均匀光照的校正
function Gray_level_correction()
img = imread('pout.tif'); % 读取文件
% img = imread('rice.png'); % 读取文件
figure('Name','不均匀光照的校正'); % 开一个叫不均匀光照的校正的窗口
subplot(3,3,1);imshow(img);title('pout.tif原图'); % 显示原图
subplot(3,3,4);imhist(img);title('pout.tif原图直方图'); % 显示直方图
img_1 = blkproc(img,[32,32],'min(x(:))'); % 相当于滤波 大一点不会出现突兀的色块
s = size(img_1);
if(img_1(s(1),s(2))==0) % blkproc可能会出现黑边
img_1 = img_1(1:s(1)-1,1:s(2)-1);
end
img_1 = imresize(img_1, size(img), 'bilinear'); % 双线性插值,插到原图大小
subplot(3,3,2);imshow(img_1);title('pout.tif背景'); % 显示背景
img_1 = imsubtract(img,img_1); % 图像减法
subplot(3,3,3);imshow(img_1);title('pout.tif光照校正图像'); % 显示光照校正图像
subplot(3,3,6);imhist(img_1);title('pout.tif校正直方图'); % 显示直方图
max_1 = double(max(img_1(:))); % 得到像素最大值
min_1 = double(min(img_1(:))); % 得到像素最小值
subplot(3,3,5);plot([min_1,max_1],[0,255]);
axis([0 255 0 255]);title('线性变换函数'); %显示线性变换函数
img_2 = imadjust(img_1,[min_1/255,max_1/255],[]);
subplot(3,3,9);imhist(img_2);title('pout.tif变换后直方图'); % 显示变换后直方图
subplot(3,3,7);imshow(img_2);title('pout.tif变换后图像'); % 显示变换后图像
end
% 三段线性变换增强 对couple.tif处理
function Piecewise_linear_transformation()
img = imread('couple.tif'); % 读取文件
figure('Name','三段线性变换增强'); % 开一个叫三段线性变换增强的窗口
subplot(2,3,1);imshow(img);title('couple.tif原图'); % 显示原图
subplot(2,3,4);imhist(img);title('couple.tif原图直方图'); % 显示直方图
len = numel(img); % 求一下矩阵的像素数
len_3 = len/3; % 求1/3像素数
pt = imhist(img); % 得到各个像素值的像素数
c = 0; % 像素计数
x_1 = 0; % 1/3处
x_2 = 0; % 2/3处
for i =[0:255]
c = c+pt(i+1);
if(c>len_3&&~x_1) % 到了1/3处
x_1=double(i); % x_1下当前的数值
end
if(c>len_3+len_3&&~x_2) % 到了2/3处
x_2=double(i); % x_2下当前的数值
end
end
k1 = 85/(x_1-0);
b1 = 85-k1*x_1;
k2 = 85/(x_2-x_1);
b2 = 170-k2*x_2;
k3 = 85/(255-x_2);
b3 = 255-k3*255;
subplot(2,3,5);plot([0,x_1,x_2,255],[0,85,170,255]);
axis([0 255 0 255]);title('线性变换函数'); %显示线性变换函数
img = double(img);
img_1 = uint8(((img*k1+b1).*(img<=x_1)+(img*k2+b2).*((x_1
% 灰度修正函数,对pout.tif和tire.tif处理
function Gray_correction()
img_p = imread('pout.tif'); % 读取文件
img_t = imread('tire.tif'); % 读取文件
figure('Name','灰度修正'); % 开一个叫灰度修正的窗口
% pout.tif
subplot(2,5, 1);imshow(img_p);title('pout.tif原图'); % 显示原图
subplot(2,5, 2);imhist(img_p);title('pout.tif直方图'); % 显示直方图
max_p = double(max(img_p(:))); % 得到像素最大值
min_p = double(min(img_p(:))); % 得到像素最小值
subplot(2,5, 3);plot([min_p,max_p],[0,255]);
axis([0 255 0 255]);title('线性变换函数'); %显示线性变换函数
img2_p = imadjust(img_p,[min_p/255,max_p/255],[]);
subplot(2,5, 4);imhist(img2_p);title('pout.tif变换后直方图'); % 显示变换后直方图
subplot(2,5, 5);imshow(img2_p);title('pout.tif变换后图像'); % 显示变换后图像
% tire.tif
subplot(2,5, 6);imshow(img_t);title('tire.tif原图'); % 显示原图
subplot(2,5, 7);imhist(img_t);title('tire.tif直方图'); % 显示直方图
m_t = double(median(img_t(:))); % 中位数
k1 = 128/m_t; % 第一根线的k
k2 = 128/(255 - m_t); % 第二根线的k
subplot(2,5, 8);plot([0,m_t,255],[0,128,255]);
axis([0 255 0 255]);title('线性变换函数'); %显示线性变换函数
img2_t = (img_t*k1).*uint8(img_t<=m_t)+(img_t*k2+(255*(1-k2))).*uint8(img_t>m_t);
subplot(2,5, 9);imhist(img2_t);title('tire.tif变换后直方图'); %显示变换后直方图
subplot(2,5,10);imshow(img2_t);title('tire.tif变换后图像'); %显示变换后图像
end
% 对pout.tif进行不均匀光照的校正
function Gray_level_correction()
img = imread('pout.tif'); % 读取文件
% img = imread('rice.png'); % 读取文件
figure('Name','不均匀光照的校正'); % 开一个叫不均匀光照的校正的窗口
subplot(3,3,1);imshow(img);title('pout.tif原图'); % 显示原图
subplot(3,3,4);imhist(img);title('pout.tif原图直方图'); % 显示直方图
img_1 = blkproc(img,[32,32],'min(x(:))'); % 相当于滤波 大一点不会出现突兀的色块
s = size(img_1);
if(img_1(s(1),s(2))==0) % blkproc可能会出现黑边
img_1 = img_1(1:s(1)-1,1:s(2)-1);
end
img_1 = imresize(img_1, size(img), 'bilinear'); % 双线性插值,插到原图大小
subplot(3,3,2);imshow(img_1);title('pout.tif背景'); % 显示背景
img_1 = imsubtract(img,img_1); % 图像减法
subplot(3,3,3);imshow(img_1);title('pout.tif光照校正图像'); % 显示光照校正图像
subplot(3,3,6);imhist(img_1);title('pout.tif校正直方图'); % 显示直方图
max_1 = double(max(img_1(:))); % 得到像素最大值
min_1 = double(min(img_1(:))); % 得到像素最小值
subplot(3,3,5);plot([min_1,max_1],[0,255]);
axis([0 255 0 255]);title('线性变换函数'); %显示线性变换函数
img_2 = imadjust(img_1,[min_1/255,max_1/255],[]);
subplot(3,3,9);imhist(img_2);title('pout.tif变换后直方图'); % 显示变换后直方图
subplot(3,3,7);imshow(img_2);title('pout.tif变换后图像'); % 显示变换后图像
end
% 三段线性变换增强 对couple.tif处理
function Piecewise_linear_transformation()
img = imread('couple.tif'); % 读取文件
figure('Name','三段线性变换增强'); % 开一个叫三段线性变换增强的窗口
subplot(2,3,1);imshow(img);title('couple.tif原图'); % 显示原图
subplot(2,3,4);imhist(img);title('couple.tif原图直方图'); % 显示直方图
len = numel(img); % 求一下矩阵的像素数
len_3 = len/3; % 求1/3像素数
pt = imhist(img); % 得到各个像素值的像素数
c = 0; % 像素计数
x_1 = 0; % 1/3处
x_2 = 0; % 2/3处
for i =[0:255]
c = c+pt(i+1);
if(c>len_3&&~x_1) % 到了1/3处
x_1=double(i); % x_1下当前的数值
end
if(c>len_3+len_3&&~x_2) % 到了2/3处
x_2=double(i); % x_2下当前的数值
end
end
k1 = 85/(x_1-0);
b1 = 85-k1*x_1;
k2 = 85/(x_2-x_1);
b2 = 170-k2*x_2;
k3 = 85/(255-x_2);
b3 = 255-k3*255;
subplot(2,3,5);plot([0,x_1,x_2,255],[0,85,170,255]);
axis([0 255 0 255]);title('线性变换函数'); %显示线性变换函数
img = double(img);
img_1 = uint8(((img*k1+b1).*(img<=x_1)+(img*k2+b2).*((x_1
% 图像平滑方法。测试图像为eight.tif
function Image_smoothing()
img = imread('eight.tif'); % 读取文件
figure('Name','图像平滑'); % 开一个叫图像平滑的窗口
subplot(2,4,1);imshow(img);title('eight.tif原图'); % 显示原图
img_1 = imnoise(img,'poisson'); % 泊松噪声
img_2 = imnoise(img,'salt & pepper'); % 椒盐噪声
img_3 = imnoise(img,'gaussian'); % 高斯噪声
subplot(2,4,2);imshow(img_1);title('泊松噪声'); % 显示泊松噪声图像
subplot(2,4,3);imshow(img_2);title('椒盐噪声'); % 显示椒盐噪声图像
subplot(2,4,4);imshow(img_3);title('高斯噪声'); % 显示高斯噪声图像
h = 1/9.*[1 1 1;1 1 1;1 1 1];
img_1 = filter2(h,img_1); % 均值滤波
img_2 = medfilt2(img_2); % 中值滤波
h = 1/16.*[1 2 1 ;2 4 2 ;1 2 1];
img_3 = filter2(h,img_3); % 高斯滤波
subplot(2,4,6);imshow(img_1,[]);title('泊松噪声-均值滤波'); % 显示泊松噪声处理后图像
subplot(2,4,7);imshow(img_2,[]);title('椒盐噪声-中值滤波'); % 显示椒盐噪声处理后图像
subplot(2,4,8);imshow(img_3,[]);title('高斯噪声-高斯滤波'); % 显示高斯噪声处理后图像
end
% 图像锐化方法。测试图像为rice.tif、cameraman.tif
function Image_Sharpening()
img_r = imread('rice.png'); % 读取文件
img_c = imread('cameraman.tif'); % 读取文件
figure('Name','图像锐化'); % 开一个叫图像锐化的窗口
subplot(2,5,1);imshow(img_r);title('rice.tif原图'); % 显示原图
subplot(2,5,6);imshow(img_c);title('cameraman.tif原图'); % 显示原图
subplot(2,5,2);imshow(edge(img_r,'roberts',0.01));title('罗伯茨梯度-R-0.01');
subplot(2,5,7);imshow(edge(img_c,'roberts',0.01));title('罗伯茨梯度-C-0.01');
subplot(2,5,3);imshow(edge(img_r,'roberts',0.04));title('罗伯茨梯度-R-0.04');
subplot(2,5,8);imshow(edge(img_c,'roberts',0.04));title('罗伯茨梯度-C-0.04');
subplot(2,5,4);imshow(edge(img_r,'roberts',0.07));title('罗伯茨梯度-R-0.07');
subplot(2,5,9);imshow(edge(img_c,'roberts',0.07));title('罗伯茨梯度-C-0.07');
subplot(2,5,5);imshow(edge(img_r,'roberts',0.1 ));title('罗伯茨梯度-R-0.1');
subplot(2,5,10);imshow(edge(img_c,'roberts',0.1));title('罗伯茨梯度-C-0.1');
end