数字图像处理(图像增强、复原)

1.图像增强:对于噪声图像、模糊图像等对图像信息增强以突出有用信息。

  • 高通平滑、低通锐化;平滑模糊、锐化突出图像细节
  • 滤波器还有带通、带阻等形式
  • 根据噪声(椒盐噪声、高斯噪声....)的不同,选用不同的滤波
  • 邻域有4-邻域、对角邻域、8-邻域,相对应的有邻接,即空间上相邻、像素灰度相似
  • 图像边缘处理:忽略不处理、补充、循环使用
  • 目前尚未图像处理大多基于灰度图像
% %低通滤波器,filtertype-滤波器的种类,n-滤波器的阶数,image-待滤波的原图像
% function H=lpfilter(filtertype,D0,n,image)
% im=imread(image);
% [DIM1,DIM2,K]=size(im);%确定原始图像大小
% if K==3
%     im1=rgb2hsv(im);
%     im2=double(im1(:,:,3));
% else
%     im2=double(im);
% end
% u=0:(DIM1-1);
% v=0:(DIM2-1);
% idx=find(u>DIM1/2);
% u(idx)=u(idx)-DIM1;
% idy=find(v>DIM2/2);
% v(idy)=v(idy)-DIM2;
% [V,U]=meshgrid(v,u);
% D=sqrt(U.^2+V.^2);%计算坐标到频域中心的距离
% 
% switch filtertype
%     case 'ideal'%理想
%         H=double(D<=D0);
%     case 'butterworth'%巴特沃斯
%         H=1./(1+(D./D0).^(2*n));
%     case 'guassian'%高斯
%         H=exp(-(D.^2)./(2*(D0^2)));
%     case 'exponent'%指数低通
%         H=exp(-D./(2*D0)./(2*D0));
%     case 'trapezoid'%梯形低通
%         if D<=D0
%             H=1.0;
%         else if D>100
%                 H=0.0;
%             else
%                 H=(D-100)./(D0-100);
%             end
%         end
%     otherwise
%         error('Unkown filter type.');
% end
% F=(fft2(im2));
% G=H.*F;
% g=real((ifft2(G)));
% figure;
% subplot(1,2,1);
% imshow(im2,[]);
% title('Original Image');%原始图像灰度部分
% subplot(1,2,2);
% imshow(g,[]);
% title('Lowpass Filtered Image');%低通效果
%H=lpfilter('ideal',14,1,'cat.jpg');

%低通滤波器,filtertype-滤波器的种类,n-滤波器的阶数,image-待滤波的原图像
function H=lpfilter(filtertype,D0,n,image)
im=imread(image);
[DIM1,DIM2,K]=size(im);%确定原始图像大小
if K==3
    im1=rgb2hsv(im);
    im2=double(im1(:,:,3));
else
    im2=double(im);
end
u=0:(DIM1-1);
v=0:(DIM2-1);
idx=find(u>DIM1/2);
u(idx)=u(idx)-DIM1;
idy=find(v>DIM2/2);
v(idy)=v(idy)-DIM2;
[V,U]=meshgrid(v,u);
D=sqrt(U.^2+V.^2);%计算坐标到频域中心的距离

switch filtertype
    case 'ideal'%理想
        Hlp=double(D<=D0);
    case 'butterworth'%巴特沃斯
        if nargin==4
            n=1;
        end
        Hlp=1./(1+(D./D0).^(2*n));
    case 'guassian'%高斯
        Hlp=exp(-(D.^2)./(2*(D0^2)));
    otherwise
        error('Unkown filter type.');
end
H=1-Hlp;
F=(fft2(im2));
G=H.*F;
g=real((ifft2(G)));
figure;
subplot(1,2,1);
imshow(im2,[]);
title('Original Image');%原始图像灰度部分
subplot(1,2,2);
imshow(g,[]);
title('Lowpass Filtered Image');%低通效果

2.图像复原:改善图像质量(模糊、失真、噪声)

常见噪声:高斯、瑞利、伽马(爱尔兰)、指数、均匀、脉冲(椒盐)等

根据图像不同采用不同滤波器进行复原,重要的是复原的步骤及各个方法的特点

  • 逆滤波法无噪声下可精确复原
  • 维纳滤波法需要较多先验知识,实现难度大
  • 最大熵恢复法是非线性算法,耗时
  • 卡尔曼滤波法要根据前一个估计值和最近一个观测数据,计算量大
  • 传播波方程恢复法利用物理知识复原,但对运动方向敏感
  • 逆滤波复原形式简单,适合极高信噪比条件,但计算量大
  • 维纳滤波对不同区域误差不敏感,不能处理非平稳信号和噪声
  • 算术平均滤波器可消噪,平滑但模糊
  • 几何平均滤波器平滑效果更好,丢失细节少
  • 谐波均值滤波器处理高斯、盐噪声效果好,不适应椒噪声
  • 谐逆波滤波器不同情况下适用椒、盐噪声
  • 中值滤波器适用椒盐噪声
  • 最大/小值滤波器适用椒/盐噪声
  • 中点滤波器适用高斯、均匀噪声
% %逆滤波复原
% I=imread('cat.jpg');
% L=10;
% T=10;
% PSF=fspecial('motion',L,T);
% Blurred=imfilter(I,PSF,'circular','conv');
% subplot(2,2,1);imshow(I);
% subplot(2,2,2);imshow(Blurred);
% R=deconvwnr(Blurred,PSF);
% subplot(2,2,3);imshow(R);

3.图像分割

 注重方法的实现:阈值分割、基于区域、基于能量及有些方法的改进。

%Hough变换
clc;
clear all;
I=imread('cat.jpg');
I=rgb2gray(I);
subplot(1,2,1);imshow(I);
rotI=imrotate(I,33,'crop');%imrotate(A,angle),将图像A围绕其中心点进行angle角度的逆时针旋转
BW=edge(rotI,'canny');%采用灰度或一个二值化图像I作为它的输入,并返回一个与I相同大小的二值化图像BW,在函数检测到边缘的地方为1,其他地方为0。
[H,T,R]=hough(BW);
subplot(1,2,2);imshow(H,[],'XData',T,'YData',R,'InitialMagnification','fit');
% %均值迭代分割
% I=imread('cat.jpg');
% [w,h]=size(I);
% %1--初始化
% avg=0.0;%图像的平均值
% for y=1:h
% for x=1:w
%     avg=avg+double(I(x,y));
% end
% end
% Thresh=avg./w./h;%选择一个初始化的阈值T(通常取灰度值的平均值)
% %2--将图像像素分为两类:G1:灰度值>T,G2:灰度值<T
% %计算G1中所有像素的均值u1,以及G2中所有的均值u2
% curThd=Thresh;
% preThd=curThd;
% subthd=2;
% while (subthd>1.0)
%     preThd=curThd;
%     u1=0,u2=0;
%     num_u1=0,num_u2=0;
%     for y=1:h
%     for x=1:w
%         if double(I(x,y))<preThd
%             u1=u1+double(I(x,y));
%             num_u1=num_u1+1;
%         else
%             u2=u2+double(I(x,y));
%             num_u2=num_u2+1;
%         end
%     end
%     end
%     curThd=(u1./num_u1+u2./num_u2)./2;
%     subthd=abs(preThd-curThd);
% end
% for y=1:h
%     for x=1:w
%         if double(I(x,y))<curThd
%             I(x,y)=0;
%         else
%             I(x,y)=255;
%         end
%     end
% end
% R=I;
% figure,imshow(R);

%最大类间方差分割法
I=imread('cat.jpg');
level=graythresh(I);%:使用最大类间方差法找到图片的一个合适的阈值
R=im2bw(I,level);%将灰度图像转换为二值图像时,需要设定一个阈值,这个函数可以帮助我们获得一个合适的阈值
figure,imshow(R);
发布了40 篇原创文章 · 获赞 3 · 访问量 7592

猜你喜欢

转载自blog.csdn.net/OpenSceneGraph/article/details/101054397