ZYNQ图像处理(5)——基本图像处理和matlab仿真

一、前言

在图像的实时处理过程中,我们往往需要对采集到的图像做一个预处理,这些预处理包括中值滤波、均值滤波、边缘检测、形态学滤波等。这些预处理都是实时图像处理的基础,本节介绍这些基本图像处理的原理和matlab仿真。

二、均值滤波

首先要做的是最简单的均值滤波算法。均值滤波是典型的线性滤波算法,它是指在图像上对目标像素给一个模板,该模板包括了其周围的临近像素(以目标象素为中心的周围 8 个像素,构成一个滤波模板,即去掉目标像素本身),再用模板中的全体像素的平均值来代替原来像素值。中值滤波算法可以形象的用上述表格来描述,即对于每个 3*3 的阵列而言,中间像素的值,等于边缘 8 个像素的平均值。
在这里插入图片描述

三、中值滤波

无论是直接获取的灰度图像,还是由彩色图像转换得到的灰度图像,里面都有噪声的存在,噪声对图像质量有很大的影响。进行中值滤波不仅可以去除孤点噪声,而且可以保持图像的边缘特性,不会使图像产生显著的模糊,比较适合于实验中的人脸图像。中值滤波算法与均值滤波非常的相似,但滤波的效果却有很大的差别,区别如下:(1) 均值滤波相当于低通滤波,有将图像模糊化的趋势,对椒盐噪声基本无能力。(2) 中值滤波的有点事可以很好的过滤椒盐噪声,缺点是容易造成图像的不连续。中值滤波的算法非常简单,只要求得 3*3 像素阵列的中间值即可,这样就有效的移植了最大值与最小值,图像会变得均匀,对椒盐噪声有很好的滤除效果!
《基于FPGA的实时中值滤波器的硬件实现》这篇文章中介绍了一种适合FPGA实现的快速寻找中值的算法,算法过程是这样的:首先计算每一行的最大值、中值以及最小值;之后计算第一列最大值中的最小值,第二列中间值中的中间值,第三列最小值中的最大值;最后再次计算这三个值的中间值就可以得到中值了。
在这里插入图片描述

四、sobel边缘检测

所谓边缘是指其周围像素灰度急剧变化的那些象素的集合,它是图像最基本的特征。边缘存在于目标、背景和区域之间,所以,它是图像分割所依赖的最重要的依据。由于边缘是位置的标志,对灰度的变化不敏感,,因此,边缘也是图像匹配的重要的特征。边缘检测和区域划分是图像分割的两种不同的方法,二者具有相互补充的特点。在边缘检测中,是提取图像中不连续部分的特征,根据闭合的边缘确定区域。而在区 域划分中,是把图像分割成特征相同的区域,区域之间的边界就是边缘。由于边缘检测方法不需要将图像逐个像素地分割,因此更适合大图像的分割。边缘大致可以分为两种,一种是阶跃状边缘,边缘两边像素的灰度值明显不同;另一种为屋顶状边缘,边缘处于灰度值由小到大再到小的变化转折点处。边缘检测的主要工具是边缘检测模板。sobel算子是边缘检测有效的算子,主要是以下这两个矩阵,Gx=AxP,Gy=AyP。意思就是说,P矩阵是图像的3*3矩阵,然后用图像矩阵的每个像素分别去乘Ax和Ay的每个像素。Ax是行边缘检测模块,Gx代表的意思就是P矩阵右边行减去左边行,得到一个阈值,Gy也是同理。
ZYNQ图像处理(5)——基本图像处理和matlab仿真_第1张图片
得到了Gx和Gy之后,相当于是得到了行边缘阈值以及列边缘阈值,计算两者的平方和G,如果G是大于设定的阈值,则表示这是边缘,否则就不是。
ZYNQ图像处理(5)——基本图像处理和matlab仿真_第2张图片
ZYNQ图像处理(5)——基本图像处理和matlab仿真_第3张图片

五、matlab图像算法仿真

这边的matlab代码主要完成了以下的操作,先读取了一张图片。然后通过算大将RGB格式的图像转换为YUV格式的图像,由此得到了灰度图。在灰度图基础上增加椒盐噪声,然后分别测试均值滤波和中值滤波。然后对灰度图像使用边缘检测,得到二值化图像。最后用腐蚀膨胀的算法,得到形态学滤波后的二值化图像。

tic
clc;
clear all;

%read picture
%height and width
img_rgb=imread('dog.png');
h=size(img_rgb,1);
w=size(img_rgb,2);
%rgb dog show
subplot(241);
imshow(img_rgb);
title('rgb dog');

% Relized method 2:myself Algorithm realized
% Y = ( R*77 + G*150 + B*29) >>8
% Cb = (-R*44 - G*84 + B*128) >>8
% Cr = ( R*128 - G*108 - B*20) >>8
img_rgb=double(img_rgb);
img_y=zeros(h,w);
img_u=zeros(h,w);
img_v=zeros(h,w);
for i = 1 : h
    for j = 1 : w
        img_y(i,j) = bitshift(( img_rgb(i,j,1)*77 + img_rgb(i,j,2)*150 + img_rgb(i,j,3)*29),-8);
        img_u(i,j) = bitshift((-img_rgb(i,j,1)*44 - img_rgb(i,j,2)*84 + img_rgb(i,j,3)*128 + 32678),-8);
        img_v(i,j) = bitshift(( img_rgb(i,j,1)*128 - img_rgb(i,j,2)*108 - img_rgb(i,j,3)*20 + 32678),-8);
    end
end
img_y = uint8(img_y); 
img_u = uint8(img_u); 
img_v = uint8(img_v); 
%gray dog show
subplot(242);
imshow(img_y);
title('gray dog');

%noise dog show
%mean value filter
img_y=double(img_y)/255;
img_salt=imnoise(img_y,'salt & pepper',0.01);
img_y=uint8(img_y*255);
img_salt=uint8(img_salt*255);
subplot(243);
imshow(img_salt);
title('salt dog');

%mean value filter
img_salt=double(img_salt);
img_mean_filter=zeros(h-2,w-2);
mean_filter_matrix=1/9*ones(3);
for i=2:h-1
   for j=2:w-1
       img_matrix=img_salt(i-1:i+1,j-1:j+1);
       img_mean_filter(i-1,j-1)=sum(sum(img_matrix.*mean_filter_matrix));
   end
end
%mean value filter dog show
img_mean_filter=uint8(img_mean_filter);
subplot(244);
imshow(img_mean_filter);
title('mean value filter dog');

%median value filter
%algorithms suitable for FPGA
%[a11 a12 a13]             [max1 med1 min1]
%[a21 a22 a23]      to     [max2 med2 min2]
%[a31 a32 a33]             [max3 med3 min3]  
%                                 to
%                 [min_of_max med_of_med max_of_min]
%                                to
%                               [med]                     
img_salt=double(img_salt);
img_median_filter=zeros(h-2,w-2);
for i=2:h-1
   for j=2:w-1
       max1=max(img_salt(i-1,j-1:j+1));
       med1=median(img_salt(i-1,j-1:j+1));
       min1=min(img_salt(i-1,j-1:j+1));
       max2=max(img_salt(i,j-1:j+1));
       med2=median(img_salt(i,j-1:j+1));
       min2=min(img_salt(i,j-1:j+1));
       max3=max(img_salt(i+1,j-1:j+1));
       med3=median(img_salt(i+1,j-1:j+1));
       min3=min(img_salt(i+1,j-1:j+1));
       min_of_max=min([max1,max2,max3]);
       med_of_med=median([med1,med2,med3]);
       max_of_min=max([min1,min2,min3]);
       img_median_filter(i-1,j-1)=median([min_of_max,med_of_med,max_of_min]);
   end
end
%median value filter dog show
img_median_filter=uint8(img_median_filter);
subplot(245);
imshow(img_median_filter);
title('median value filter dog');

%sobel edge find
%   [-1 0 1] [P1 P2 P3]    [ 1  2  1] [P1 P2 P3]
%Gx=[-2 0 2]*[P4 P5 P6] GY=[ 0  0  0]*[P4 P5 P6]
%   [-1 0 1] [P7 P8 P9]    [-1 -2 -1] [P7 P8 P9]
%G=sqrt(Gx^2+Gy^2)
%if G<SOBEL_THRESHOLD then 0
%if G>SOBEL_THRESHOLD then 1
%img_sobel=edge(img_y,'sobel');
img_sobel_edge=zeros(h-2,w-2);
Tx=double([-1 0 1;-2 0 2;-1 0 1]);
Ty=double([1 2 1;0 0 0;-1 -2 -1]);
img_y=double(img_y);
SOBEL_THRESHOLD=60;
for i=2:h-1
   for j=2:w-1
      Gx=sum(sum(Tx.*img_y(i-1:i+1,j-1:j+1)));
      Gy=sum(sum(Ty.*img_y(i-1:i+1,j-1:j+1)));
      G=sqrt(Gx^2+Gy^2);
      if(G>SOBEL_THRESHOLD)
          img_sobel_edge(i-1,j-1)=255;
      else 
          img_sobel_edge(i-1,j-1)=0;
      end
   end
end
img_y=uint8(img_y);
subplot(246);
imshow(img_sobel_edge);
title('sobel edge dog');

%open operation:corrosion and expansion
se=strel('square',3);
open_dog_function=imopen(img_sobel_edge,se);
subplot(247);
imshow(open_dog_function);
title('open opera dog use function');
img_corrosion=zeros(h-4,w-4);
for i=2:h-3
   for j=2:w-3
       a=img_sobel_edge(i-1,j-1)&img_sobel_edge(i-1,j)&img_sobel_edge(i-1,j+1);
       b=img_sobel_edge(i,j-1)&img_sobel_edge(i,j)&img_sobel_edge(i,j+1);
       c=img_sobel_edge(i+1,j-1)&img_sobel_edge(i+1,j)&img_sobel_edge(i+1,j+1);
       if((a&b&c)==1)
           img_corrosion(i-1,j-1)=255;
       else 
           img_corrosion(i-1,j-1)=0;
       end
   end
end
img_expansion=zeros(h-6,w-6);
for i=2:h-5
   for j=2:w-5
       a=img_corrosion(i-1,j-1)|img_corrosion(i-1,j)|img_corrosion(i-1,j+1);
       b=img_corrosion(i,j-1)|img_corrosion(i,j)|img_corrosion(i,j+1);
       c=img_corrosion(i+1,j-1)|img_corrosion(i+1,j)|img_corrosion(i+1,j+1);
       if((a|b|c)==1)
           img_expansion(i-1,j-1)=255;
       else 
           img_expansion(i-1,j-1)=0;
       end
   end
end
subplot(248);
imshow(img_expansion);
title('open opera dog');

toc

最终显示的效果如下图所示。第一张图是圆图,第二张是灰度图,第三张是加了噪声的图,第四张是均值滤波后的图,第五张是中值滤波后的图,第六张是sobel边缘检测后的图,第七张是利用matlab开运算得到的结果图,第八章是对图六应用自己的方法实现的形态学滤波,可以看大图七和图八结果是几乎相同的。
ZYNQ图像处理(5)——基本图像处理和matlab仿真_第4张图片
我们还注意到,matlab完成这一系列操作花了4.68s的时间,这在实时图像处理中那就太慢了。因此FPGA完成实时图像处理很有必要。
在这里插入图片描述

你可能感兴趣的:(图像处理,matlab,计算机视觉)