数字图像处理-图像增强

数字图像处理-图像增强

1.灰度映射函数

​ 考虑使用下图所示的门形灰度映射函数,其作用是将某个灰度值范围(这里为s1s2间)变得比较突出(较高的灰度值t2),而将其余灰度值变为某个低灰度值(t1

在这里插入图片描述

其实这就和神经网络中的激活函数类似,下图是sigmoid激活函数:

img

clc;
clear;
%读取图片
f = imread("lenna_RGB.tif");

%将图片转为灰度图像
f = rgb2gray(f);
[M,N] = size(f); %获取f的大小

%设定参数
t1 = 30;
t2 = 200;

%设定阈值
s1 = 50;
s2 = 120;

%将图像的灰度值映射到t1,t2
g = uint8(zeros(M,N));
for i=1:M
    for j=1:N
        if(f(i,j)<s1 || f(i,j) > s2)
            g(i,j) = t1;
        else
            g(i,j) = t2;
        end
    end
end

%同时增大s1,S2
s1 = 70;
s2 = 140;
%将图像的灰度值映射到t1,t2
g1 = uint8(zeros(M,N));
for i=1:M
    for j=1:N
        if(f(i,j)<s1 || f(i,j) > s2)
            g1(i,j) = t1;
        else
            g1(i,j) = t2;
        end
    end
end

%同时减小s1,S2
s1 = 30;
s2 = 100;
%将图像的灰度值映射到t1,t2
g2 = uint8(zeros(M,N));
for i=1:M
    for j=1:N
        if(f(i,j)<s1 || f(i,j) > s2)
            g2(i,j) = t1;
        else
            g2(i,j) = t2;
        end
    end
end

%减小s1,增大S2
s1 = 30;
s2 = 140;
%将图像的灰度值映射到t1,t2
g3 = uint8(zeros(M,N));
for i=1:M
    for j=1:N
        if(f(i,j)<s1 || f(i,j) > s2)
            g3(i,j) = t1;
        else
            g3(i,j) = t2;
        end
    end
end

%增大s1,减小S2
S1 = 70;
S2 = 100;
%将图像的灰度值映射到t1,t2
g4 = uint8(zeros(M,N));
for i=1:M
    for j=1:N
        if(f(i,j)<s1 || f(i,j) > s2)
            g4(i,j) = t1;
        else
            g4(i,j) = t2;
        end
    end
end
figure();
subplot(3,2,1);imshow(f);title("原图");
subplot(3,2,2);imshow(g);title("门型映射");
subplot(3,2,3);imshow(g1);title("同时增大s1,s2");
subplot(3,2,4);imshow(g2);title("同时减小s1,s2");
subplot(3,2,5);imshow(g3);title("减小s1,增大s2");
subplot(3,2,6);imshow(g4);title("增大s1,减小s2");

效果图:
在这里插入图片描述

2设有一幅图像有如图所示直方图,请用手工方法列表计算该直方图的均衡化直方图。

​ 根据灰度级确定灰度直方图,然后通过灰度直方图计算tk,然后取整扩展,之后确定映射关系,最后根据映射关系计算均衡直方图。

在这里插入图片描述

表1:直方图均衡化计算列表

序号运算步骤和结果
1原始图像和灰度级k01234567
2原始直方图Sk0.1740.0880.0860.080.0680.0580.0620.384
3计算tk0.1740.2620.3480.4280.4960.5540.6161
4取整扩展12233447
5确定映射关系0->11,2->23,4->35,6>47>7
6计算均衡化直方图0.1740.1740.1480.120.384

3.直方图均衡化

​ 收集10幅灰度图像,包括过亮、过暗、对比度暗淡等图像,使用MATLAB的直方图均衡方法对其进行直方图均衡。依次显示原图、原图直方图、均衡后的图像及其直方图,尝试总结一下直方图均衡方法对什么样的图像改善效果较好。这里需要新建一个灰度图像的文件夹,并把灰度图像放置在里面命名为1-10.jpg

clear;
clc;
for i=1:10
    s = "灰度图像\"+i+".jpg";
    figure;
    f = imread(s);
    subplot(2,2,1);imshow(f);title('原图');
    subplot(2,2,2);imhist(f);title('原图直方图');
    f1 = histeq(f,256);
    subplot(2,2,3);imshow(f1);title('均衡图');
    subplot(2,2,4);imhist(f1);title('均衡直方图');
end

效果图(仅展示了三张):

4.直接均衡化 和 rgb均衡化

分别用以下两种直方图均衡方法处理画面偏红的lenna模特图像,比较一下那种方法更能改善颜色质量。

(1)直接用直方图均衡方法处理lenna彩色图像。

(2)将lenna彩色图像先分离出R、G、B三个分量,然后用直方图均衡方法分别对其进行处理,最后将处理后的三个分量合成lenna彩色图像。

clear;
clc;
figure();
f = imread("lenna_RGB.tif");
subplot(3,2,1);imshow(f);title("原图");
subplot(3,2,2);imhist(f,256);title("原图直方图");
f1 = histeq(f);
subplot(3,2,3);imshow(f1);title("直接均衡图");
subplot(3,2,4);imhist(f1,256);title("直接均衡直方图");
r =  f(:,:,1);
g =  f(:,:,2);
b =  f(:,:,3);
r1 = histeq(r);
g1 = histeq(g);
b1 = histeq(b);
f2 = cat(3,r1,g1,b1);
subplot(3,2,5);imshow(f2);title("分开均衡图");
subplot(3,2,6);imhist(f2,256);title("分开均衡直方图");

原图和效果图:

在这里插入图片描述

5 平滑 & 阈值

编程先将一幅灰度图像用3×3平均滤波器平滑一次,再进行如下增强

在这里插入图片描述

其中,G[f(x, y)]f(x,y)(x, y)**处的梯度;T是非负阈值。

(1)比较原始图像和增强图像,看哪些地方得到了增强;

(2)改变阈值T的数值,看对增强效果有哪些影响。

在这里插入图片描述

dx(i, j)可用sobel垂直梯度模板dy(i, j)可用sobel水平梯度模板(见冈萨雷斯教材表2.5),需先将*f(x,y)灰度转换为[0,1]*间的浮点数。

对图像计算出所有点处的dxdy,然后再通过求两幅滤波后图像的绝对值的和,可得相应G[f(x,y)]

clear;
clc;
f = imread("lenna_RGB.tif");
%转灰度图像
f = rgb2gray(f);
subplot(221); imshow(f);title("原图");
%转double
f = im2double(f);

%使用3*3的高斯平均进行平滑,对边缘进行忽略即从2开始
a = [1 2 1;2 4 2;1 2 1]; %高斯平均
[M,N] = size(f);
for i=2:M-1
    for j = 2:N-1
        f(i,j) = sum(sum(f(i-1:i+1,j-1:j+1).*a))/18;
    end
end
subplot(222);imshow(f);title("平滑后图像")

%sobel垂直梯度模板
Gx = fspecial("sobel");
Gy = Gx';
%求梯度并进行梯度增强
t = 0.1 ;%阈值
f1 = f(:,:);
for i=2:M-1
    for j=2:N-1
        dx =  sum(sum(f(i-1:i+1,j-1:j+1).*Gx));
        dy =  sum(sum(f(i-1:i+1,j-1:j+1).*Gy));
        G = abs(dx)+abs(dy);
        if(G >= t)
            f1(i,j) = G;
        end
    end
end
subplot(223);imshow(f1);title("t = 0.1 图像增强后图像");

%求梯度并进行梯度增强
t = 2.8; %阈值
f2 = f(:,:);
for i=2:M-1
    for j=2:N-1
        dx =  sum(sum(f(i-1:i+1,j-1:j+1).*Gx));
        dy =  sum(sum(f(i-1:i+1,j-1:j+1).*Gy));
        G = abs(dx)+abs(dy);
        if(G >= t)
            f2(i,j) = G;
        end
    end
end
subplot(224);imshow(f2);title("t = 2.8 图像增强后图像");

效果图,可以看到t=2.8时,效果较好

在这里插入图片描述

6 滤波(锐化&高频)

​ 分别使用锐化滤波和高频提升滤波对一幅图像(自备)进行锐化。分别显示原图像、平滑后的图像、锐化滤波图像、高频提升滤波图像,以及最后锐化后的增强图像。

  • 高斯平滑滤波
  • 拉普拉斯锐化滤波
  • 高频提升滤波
  • 锐化增强
clear;
clc;
%自备照片 锐化滤波 高频提升滤波
f = imread("月球.jpg");

%转为灰度图像并转为double数据类型
f = tofloat(rgb2gray(f));
%由于要直到平滑和锐化后的效果所以可以增加一些噪声来查看结果
fnoisy = imnoise(f,"salt & pepper",0.0002);
%使用高斯平滑滤波
gaussian = fspecial("gaussian");
fg = imfilter(fnoisy,gaussian,"replicate");
%使用拉普拉斯锐化滤波图像
la = fspecial("laplacian",0);
fla =imfilter(fnoisy,la);
%高频提升滤波
A = 3;
fh = (A-1)*fnoisy-fg;
%锐化后的增强图像
frla = fnoisy  - fla;


subplot(2,3,1);imshow(f);title("原图");
subplot(2,3,2);imshow(fnoisy);title("高斯加噪图");
subplot(2,3,3);imshow(fg);title("高斯平滑图");
subplot(2,3,4);imshow(fla);title("拉普拉斯锐化滤波图像");
subplot(2,3,5);imshow(fh);title("高频提升滤波图");
subplot(2,3,6);imshow(frla);title("锐化后的增强图像");

效果图:
在这里插入图片描述

7. 非线性滤波

右图是一幅受到噪声污染的图像(原始图像见本实验素材),请使用非线性滤波改善其视觉效果。

  • 几何平均
  • 中值滤波
  • 最大最小锐化变换
clear;
clc;
%获取噪声图片
f = imread("characters_noise.tif");
f = rgb2gray(f);
%使用非线性滤波改善其视觉效果
%1.平滑滤波
%几何平均
m=3;n=3;
gmean = @(A) prod(A,1).^(1/size(A,1));
g = padarray(f,[m n],'replicate','post');
f1 = colfilt(g,[m n],'sliding',gmean);
[M N] = size(g);
f1 = f1((1:M-m),(1:N-n));
%中值滤波
f2 = medfilt2(f,[m n],'symmetric');
%2锐化滤波
%最大最小锐化变换
f3 = f;
[M N] = size(f3);
for i=1:M-m+1
    for j=1:N-n+1
        temp = f3(i:i+m-1,j:j+n-1);
        temp = temp(:);
        Max = max(temp);
        Min = min(temp);
        if(Max -f3(i+(m-1)/2,j+(n-1)/2)<=f3(i+(m-1)/2,j+(n-1)/2)-Min)
            f3(i+(m-1)/2,j+(n-1)/2) = Max;
        else
            f3(i+(m-1)/2,j+(n-1)/2) = Min;
        end
    end
end
f4 = f;
for i=1:M-m+1
    for j=1:N-n+1
        temp = f4(i:i+m-1,j:j+n-1);
        temp = temp(:);
        med = median(temp);
        f4(i+(m-1)/2,j+(n-1)/2) = med;
    end
end
subplot(221);imshow(f);title("原图");
subplot(222);imshow(f1);title("几何平均");
subplot(223);imshow(f4);title("中值滤波");
subplot(224);imshow(f3);title("最大最小锐化变换");

效果图:
在这里插入图片描述

8 傅里叶频谱

​ 编程实现计算一幅图像包含指定能量(功率谱)百分比的圆周半径,函数定义如下,其中r为功率半径,f为输入的图像矩阵,b为图像能量百分比:

r = p o w e r R a d i u s ( f , b ) r = powerRadius(f, b) r=powerRadius(f,b)
提示:

  1. 能量百分比计算如下,其中P(u,v)为功率谱:

在这里插入图片描述
在这里插入图片描述

  1. 傅里叶频谱,即我们经常看到的频谱图像可以使用函数abs得到,功率谱为频谱的平方,则:P(u,v)=abs(F)^2

    3.F为图像f经paddedisze函数填充后的居中的傅里叶变换,即:

P Q = p a d d e d s i z e ( s i z e ( f ) ) F = s h i f t ( f f t 2 ( f , P Q ( 1 ) , P Q ( 2 ) ) ) PQ = paddedsize(size(f)) F = shift(fft2(f, PQ(1), PQ(2))) PQ=paddedsize(size(f))F=shift(fft2(f,PQ(1),PQ(2)))

clear;
clc;
f = imread("Lena_Soderberg.jpg");
f = tofloat(f);
%调用powerRadius获得B图像能量的半径
r1 = powerRadius(f,90);
r2 = powerRadius(f,95);
r3 = powerRadius(f,99);

powerRadius.m

function r = powerRadius(f,b)
r =-1;
f = tofloat(f);
%使用paddedisze函数填充PQ
PQ = paddedsize(size(f));
%F为图像f经paddedisze函数填充后的居中的傅里叶变换
F = fftshift(fft2(f, PQ(1), PQ(2)));
%得到功率谱
P = abs(F).^2;
%从功率谱中找到匹配的半径
s = sum(sum(P(1:PQ(1),1:PQ(2))));
[mid] = floor((size(P)+1)/2);
for i = 1:min([PQ(1)-mid(1),PQ(2)-mid(2),mid(1)-1,mid(2)-1])
    if((sum(sum(P(mid(1)-i:mid(1)+i,mid(2)-i:mid(2)+i)))/s*100 >=b))
        r = i;
        break;
    end
end

效果图:

在这里插入图片描述

​ 结果是得到了90%,95%,99%的能量谱的半径,发现90%的能量仅需要半径为12就可以,而仅增加9%的能量,半径去变成了120,可以得到的是越靠近中心得点得能量越高。

9 低通过滤器

​ 依次使用包含了原始图像中90%、95%、99%的能量的圆周r作为截断频率D0,使用理想低通过滤器和巴特沃斯低通过滤器(n=1)对图像进行过滤,显示原图及用不同截断频率的各过滤器过滤后的图像。

  • 理想低通D90
  • 1阶巴特沃斯低通D90
  • 理想低通D95
  • 1阶巴特沃斯低通D95
  • 理想低通D99
  • 1阶巴特沃斯低通D99
clear;
clc;
f=imread('lenna_RGB.tif');
f = rgb2gray(f);
[f, revertclass] = tofloat(f);
PQ = paddedsize(size(f));


%这里添加各个阻断频率
D_90 = powerRadius(f,90);
D_95 = powerRadius(f,95);
D_99 = powerRadius(f,99);

%得到过滤器
H_real_90 = lpfilter('ideal',PQ(1),PQ(2),D_90);
H_btw_90 = lpfilter('btw', PQ(1), PQ(2),D_90,1);
H_real_95 = lpfilter('ideal',PQ(1),PQ(2),D_95);
H_btw_95 = lpfilter('btw', PQ(1), PQ(2),D_95,1);
H_real_99 = lpfilter('ideal',PQ(1),PQ(2),D_99);
H_btw_99 = lpfilter('btw', PQ(1), PQ(2),D_99,1);

%使用傅里叶变换*过滤器并反变换后回到tofloat之前
g_real_90 = revertclass(dftfilt(f, H_real_90));
g_btw_90 = revertclass(dftfilt(f, H_btw_90));
g_real_95 = revertclass(dftfilt(f, H_real_95));
g_btw_95 = revertclass(dftfilt(f, H_btw_95));
g_real_99 = revertclass(dftfilt(f, H_real_99));
g_btw_99 = revertclass(dftfilt(f, H_btw_99));

%显示结果
figure;
subplot(3,3,1); imshow(f); title('原始图像');
subplot(3,3,2); imshow(g_real_90); title('理想低通D90')
subplot(3,3,3); imshow(g_btw_90); title('1阶巴特沃斯低通D90');
subplot(3,3,4); imshow(f); title('原始图像');
subplot(3,3,5); imshow(g_real_95); title('理想低通D95')
subplot(3,3,6); imshow(g_btw_95); title('1阶巴特沃斯低通D95');
subplot(3,3,7); imshow(f); title('原始图像');
subplot(3,3,8); imshow(g_real_99); title('理想低通D99')
subplot(3,3,9); imshow(g_btw_99); title('1阶巴特沃斯低通D99');

paddedsize.m

function  PQ = paddedsize(AB, CD, PARAM)
%PADDEDSIZE Computes padded sizes useful for FFT-based filtering
% PQ = PADDEDSIZE(AB), where AB is a two-element size vector,
% computes the two-element size vector PQ = 2*AB.
%
% PQ = PADDEDSIZE(AB, 'PWR2') computes the vector PQ such that
% PQ(1)=PQ(2)=2^nextpow2(2*m), where m is MAX(AB).
%
% PQ = PADDEDSIZE(AB, CD), where AB and CD are two-element size vectors,
% computes the two-element size vector PQ. The elements of PQ are the 
% smallest even integers greater than or equal to AB+CD-1.
% PQ = PADDEDSIZE(AB, CD, 'PWR2') computes the vector PQ such that
% PQ(1)=PQ(2)=2^nextpow2(2*m), where m is MAX([AB CD]).

if nargin == 1
    PQ = 2*AB;
elseif nargin == 2 & ~ischar(CD)
    PQ = AB + CD -1;
    PQ = 2 * ceil(PQ/2); %ceil(x):返回不小于x的最小整数
elseif nargin == 2
    m = max(AB); % Maximum dimension.
    % Find power-of-2 at least twice m
    P = 2^nextpow2(2*m);
    PQ = [P, P];
elseif (nargin == 3) && strcmpi(PARAM, 'pwr2')
    m = max([AB CD]); % Maximum dimension.
    P = 2^nextpow2(2*m);
    PQ = [P, P];
else
    error('Wrong number of inputs');
end
    

powerRadius.m

function r = powerRadius(f,b)
r =-1;
f = tofloat(f);
%使用paddedisze函数填充PQ
PQ = paddedsize(size(f));
%F为图像f经paddedisze函数填充后的居中的傅里叶变换
F = fftshift(fft2(f, PQ(1), PQ(2)));
%得到功率谱
P = abs(F).^2;
%从功率谱中找到匹配的半径
s = sum(sum(P(1:PQ(1),1:PQ(2))));
[mid] = floor((size(P)+1)/2);
for i = 1:min([PQ(1)-mid(1),PQ(2)-mid(2),mid(1)-1,mid(2)-1])
    if((sum(sum(P(mid(1)-i:mid(1)+i,mid(2)-i:mid(2)+i)))/s*100 >=b))
        r = i;
        break;
    end
end

效果图:
在这里插入图片描述

​ 结果是得到了以90%,95%,99%的能量谱的半径作为阶段频率得理想低通过滤和巴特沃斯过滤得到得图像,发现仅90%的能量半径得图像非常模糊,而仅增加9%的能量,半径去变成了120,可以得到的是效果更加得清晰自然。而巴特沃斯过滤得到得图像更加得清晰自然相较于理想低通过滤。

10高通滤波

​ 依次使用包含了原始图像中90%、95%、99%的能量的圆周r作为截断频率D0,使用理想高通过滤器和巴特沃斯高通过滤器(n=1)对图像进行过滤,显示原图及用不同截断频率的各过滤器过滤后的图像。

clear;
clc;
f=imread('lenna_RGB.tif');
f = rgb2gray(f);
[f, revertclass] = tofloat(f);
PQ = paddedsize(size(f));


%这里添加各个阻断频率
D_90 = powerRadius(f,90);
D_95 = powerRadius(f,95);
D_99 = powerRadius(f,99);

%得到过滤器
H_real_90 = hpfilter('ideal',PQ(1),PQ(2),D_90);
H_btw_90 = hpfilter('btw', PQ(1), PQ(2),D_90,1);
H_real_95 = hpfilter('ideal',PQ(1),PQ(2),D_95);
H_btw_95 = hpfilter('btw', PQ(1), PQ(2),D_95,1);
H_real_99 = hpfilter('ideal',PQ(1),PQ(2),D_99);
H_btw_99 = hpfilter('btw', PQ(1), PQ(2),D_99,1);

%使用傅里叶变换*过滤器并反变换后回到tofloat之前
g_real_90 = revertclass(dftfilt(f, H_real_90));
g_btw_90 = revertclass(dftfilt(f, H_btw_90));
g_real_95 = revertclass(dftfilt(f, H_real_95));
g_btw_95 = revertclass(dftfilt(f, H_btw_95));
g_real_99 = revertclass(dftfilt(f, H_real_99));
g_btw_99 = revertclass(dftfilt(f, H_btw_99));

%显示结果
figure;
subplot(3,3,1); imshow(f); title('原始图像');
subplot(3,3,2); imshow(g_real_90); title('理想高通D90')
subplot(3,3,3); imshow(g_btw_90); title('1阶巴特沃斯高通D90');
subplot(3,3,4); imshow(f); title('原始图像');
subplot(3,3,5); imshow(g_real_95); title('理想高通D95')
subplot(3,3,6); imshow(g_btw_95); title('1阶巴特沃斯高通D95');
subplot(3,3,7); imshow(f); title('原始图像');
subplot(3,3,8); imshow(g_real_99); title('理想高通D99')
subplot(3,3,9); imshow(g_btw_99); title('1阶巴特沃斯高通D99');

效果图:
在这里插入图片描述

​ 结果是得到了以90%,95%,99%的能量谱的半径作为阶段频率得理想高通过滤和巴特沃斯过滤得到得图像,发现90%的能量半径得图像中仅显示了高频像素使得高频特征更加得明显,再99%得半径下基本上已经将所有得频率都给阶段掉了。

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Afraidlight

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值