目录
1.生成并绘制图像直方图
2.灰度变换
3.直方图均衡化
4. 图像中值滤波
(1)查阅教材 3.3 节关于直方图相关内容,理解其基本概念;
(2)查阅 matlab 图像处理工具箱中函数 imhist,熟悉其基本语法实现直方图的统计;
(3)利用 imhist 函数或者 bar 函数绘制直方图;
(4)观察并分析不同图像的直方图的差异。
figure('Name', '图像图统计实验图直方图匹配','NumberTitle','off') % 创建一个图窗并指定 Name 属性。'NumberTitle','off' 不显示编号
img1 = imread('1.tif');
img2 = imread('2.tif');
img3 = imread('3.tif');
img4 = imread('4.tif');
subplot(2,4,1);
imshow(img1);
title("1.tif");
subplot(2,4,2);
imshow(img2);
title("2.tif");
subplot(2,4,3);
imshow(img3);
title("3.tif");
subplot(2,4,4);
imshow(img4);
title("4.tif");
subplot(2,4,5);
imhist(img1,256); % 显示图像的直方图。
title("1.tif 的直方图");
subplot(2,4,6);
imhist(img2,256);
title("2.tif 的直方图");
subplot(2,4,7);
imhist(img3,256);
title("3.tif 的直方图");
subplot(2,4,8);
imhist(img4,256);
title("4.tif 的直方图");
(1)查阅教材 3.1-3.2 节内容,理解灰度变换的概念和步骤;
(2)查阅 matlab 图像处理工具箱中函数 imadjust,熟悉其基本语法。
(3)修改 imadjust 函数参数(重点调整伽马值),实现并对比不同参数配置下的图像 灰度变换结果。
figure('Name', '灰度变化实验图','NumberTitle','off') % 创建一个图窗并指定 Name 属性。'NumberTitle','off' 不显示编号
img1 = imread('1.tif');
img2 = imread('2.tif');
subplot(2,3,1);
imshow(img1);
title("1.tif");
% 编程实现伽马变化,像素点操作
J = im2double(img1);
C = 1;
r = 0.5;
N = C*(J .^ r);
subplot(2,3,2);
imshow(N);
title("C=1 r=1.5"); % x小则亮
%如果 gamma 小于 1,则 imadjust 会对映射加权,使之偏向更高(更亮)输出值。
%如果 gamma 大于 1,则 imadjust 会对映射加权,使之偏向更低(更暗)输出值。
%如果 gamma 是 1×3 向量,则 imadjust 会对每个颜色分量或通道分别应用不同的 gamma。
subplot(2,3,3);
I = imadjust(img1,[],[],r); % 内置函数实现gamma变换
imshow(I);
title("imadjust实现 r=1.5");
%--------------------------------------------------------------------------%
subplot(2,3,4);
imshow(img2);
title("2.tif");
J = im2double(img2);
N = C*(J .^ r);
subplot(2,3,5);
imshow(N);
title("C=1 r=1.5");
subplot(2,3,6);
I = imadjust(img2,[],[],r);
imshow(I);
title("imadjust实现 r=1.5");
(1)查阅教材 3.3 节内容,理解直方图均衡化的概念和步骤;
(2)查阅 matlab 图像处理工具箱中函数 histeq,熟悉其基本语法;
(3)利用 histeq 函数实现图像直方图均衡化处理,并对比分析图像处理前后差异。
figure('Name', '直方图均衡化','NumberTitle','off') % 创建一个图窗并指定 Name 属性。'NumberTitle','off' 不显示编号
img1 = imread('1.tif');
img2 = imread('2.tif');
J1 = histeq(img1); %均衡
J2 = histeq(img2);
subplot(2,4,1);
imshow(img1);
title("原图1.tif");
subplot(2,4,2);
imhist(img1);
title("原图1.tif直方图");
subplot(2,4,3);
imhist(J1);
title("1.tif均衡直方图");
subplot(2,4,4);
imshow(J1);
title("均衡1.tif");
%--------------------------------------%
subplot(2,4,5);
imshow(img2);
title("原图2.tif");
subplot(2,4,6);
imhist(img2);
title("原图2.tif直方图");
subplot(2,4,7);
imhist(J2);
title("2.tif均衡直方图");
subplot(2,4,8);
imshow(J2);
title("均衡2.tif");
(1)查阅教材 3.5.2 节内容,理解中值滤波的概念和步骤;
(2)利用 matlab 基本的矩阵操作和语法编程实现中值滤波函数
medianFilter: B = medianFilter(A, [m n])
% A 为输入图像,B 为输出图像,模板大小为 m×n,不处理边界
(3)利用自己实现的函数 medianFilter 对给定的图像进行滤波,并与 matlab 工具箱 中自带的中值滤波函数 medfilt2 进行比较。
figure('Name', '中值滤波实验','NumberTitle','off') % 创建一个图窗并指定 Name 属性。'NumberTitle','off' 不显示编号
img1 = imread('img.tif');
img2 = imread('noiseImg.tif');
n=7;
J1=medfilt2(img1,[n,n]);
J2=medfilt2(img2,[n,n]);
subplot(2,3,1);
imshow(img1);
title("原图img.tif");
subplot(2,3,2);
B=medianFilter(img1,n,n);
imshow(B);
title("5 x 5自编中值滤波");
subplot(2,3,3);
imshow(J1);
title("5 x 5matalab中值滤波");
%----------------------------%
subplot(2,3,4);
imshow(img2);
title("原图noiselmg.tif");
subplot(2,3,5);
imshow(medianFilter(img2,n,n));
title("5 x 5自编中值滤波");
subplot(2,3,6);
imshow(J2);
title("5 x 5matalab中值滤波");
medianFliter.m
function B = medianFilter(A,m,n) % 不处理边界
[height, width]=size(A);
B=A; %转换后的数据赋给B
for i=1:height-n+1
for j=1:width-n+1
c=A(i:i+(m-1),j:j+(n-1)); %在x1中从头取模板大小的块赋给c
e=c(1,:); %e中存放是c矩阵的第一行
for u=2:m %将c中的其他行元素取出来接在e后使e为一个行矩阵
e=[e,c(u,:)];
end
med=median(e); %取一行的中值
B(i+(m-1)/2,j+(n-1)/2)=med; %将模板各元素的中值赋给模板中心位置的元素
end
end