当前位置:   article > 正文

MATLAB实现图像处理_基于matlab的图像信号处理csdn

基于matlab的图像信号处理csdn

MATLAB即矩阵实验室(matrix laboratory),我们都知道一副图片的像素数据可以看成是一个二维数组一个大矩阵,所以MTABLAB就是用来矩阵运算,这篇文章主要是根据原理用MATLAB实现一些图像处理的基础算法,作为使用FPGA实现各种图像处理算法的前期仿真,为下一步写电路奠定基础。

原始的RGB图像(RGB_data)

  1. clc;
  2. clear all;
  3. close all;
  4. RGB_data = imread('l.jpg');
  5. R_data = RGB_data(:,:,1);
  6. G_data = RGB_data(:,:,2);
  7. B_data = RGB_data(:,:,3);
  8. imshow(RGB_data);

灰度图像(Gray_data)

        要将RGB转化为YCbCr格式,需要将Y分量提取出来,Y分量表示的是图像的亮度和浓度得到的图像就是灰度图像。其中YCbCr是通过有序的三元组来表示的,三元由Y(Luminance)、Cb(Chrominance-Blue)和Cr(Chrominance-Red)组成,其中Y表示颜色的明亮度和浓度,而Cb和Cr则分别表示颜色的蓝色浓度偏移量和红色浓度偏移量。

算法公式

  1. [ROW,COL, DIM] = size(RGB_data);
  2. Y_data = zeros(ROW,COL);
  3. Cb_data = zeros(ROW,COL);
  4. Cr_data = zeros(ROW,COL);
  5. Gray_data = RGB_data;
  6. for r = 1:ROW
  7. for c = 1:COL
  8. Y_data(r, c) = 0.299*R_data(r, c) + 0.587*G_data(r, c) + 0.114*B_data(r, c);
  9. Cb_data(r, c) = -0.172*R_data(r, c) - 0.339*G_data(r, c) + 0.511*B_data(r, c) + 128;
  10. Cr_data(r, c) = 0.511*R_data(r, c) - 0.428*G_data(r, c) - 0.083*B_data(r, c) + 128;
  11. end
  12. end
  13. Gray_data(:,:,1)=Y_data;
  14. Gray_data(:,:,2)=Y_data;
  15. Gray_data(:,:,3)=Y_data;
  16. figure;
  17. imshow(Gray_data)

加椒盐噪声的图像(imgn)

椒盐噪声就是在图像上随机出现黑色白色的像素。椒盐噪声是一种因为信号脉冲强度引起的噪声。

  1. imgn = imnoise(Gray_data,'salt & pepper',0.02);
  2. figure;
  3. imshow(imgn);

对加椒盐噪声的图像进行中值滤波处理(Median_Img)

中值滤波方法是,对待处理的当前像素,选择一个模板3x3矩阵,该模板为其邻近的若干个像素组成,对模板的像素由小到大进行排序,再用模板的中值来替代原像素的值的方法。

排序算法

(1)对窗内的每行像素按降序排序,得到最大值、中间值和最小值。

(2)把三行的最小值即第三列相比较,取其中的最大值。

(3)把三行的最大值即第一列相比较,取其中的最小值。

(4)把三行的中间值即第二列相比较,再取一次中间值。

(5)把前面的到的三个值再做一次排序,获得的中值即该窗口的中值。 

  1. Median_Img = Gray_data;
  2. for r = 2:ROW-1
  3. for c = 2:COL-1
  4. median3x3 =[imgn(r-1,c-1) imgn(r-1,c) imgn(r-1,c+1)
  5. imgn(r,c-1) imgn(r,c) imgn(r,c+1)
  6. imgn(r+1,c-1) imgn(r+1,c) imgn(r+1,c+1)];
  7. sort1 = sort(median3x3, 2, 'descend');
  8. sort2 = sort([sort1(1), sort1(4), sort1(7)], 'descend');
  9. sort3 = sort([sort1(2), sort1(5), sort1(8)], 'descend');
  10. sort4 = sort([sort1(3), sort1(6), sort1(9)], 'descend');
  11. mid_num = sort([sort2(3), sort3(2), sort4(1)], 'descend');
  12. Median_Img(r,c) = mid_num(2);
  13. end
  14. end
  15. figure;
  16. imshow(Median_Img);

边缘检测后的图像(Sobel_Img)

Sobel边缘检测的核心在于像素矩阵的卷积,本质就是对指定的图像区域的像素值进行加权求和的过程

边沿检测Sobel算子的实现:(A为原始图像)

(1) 计算Gx与Gy与模板每行的乘积。

(2) 两个3x3矩阵的卷积即将每一行每一列对应相乘然后相加。

(3) 求得3*3模板运算后的Gx、Gy。

(4) 求Gx^2 + Gy^2的平方根或者直接对Gx和Gy取绝对值后求和。

(5)设置一个阈值,运算后的像素值大于该阈值输出为全1,小于该阈值输出为全0。

  1. Median_Img = double(Median_Img);
  2. Sobel_Threshold = 150;
  3. Sobel_Img = zeros(ROW,COL);
  4. for r = 2:ROW-1
  5. for c = 2:COL-1
  6. Sobel_x = Median_Img(r-1,c+1) + 2*Median_Img(r,c+1) + Median_Img(r+1,c+1) - Median_Img(r-1,c-1) - 2*Median_Img(r,c-1) - Median_Img(r+1,c-1);
  7. Sobel_y = Median_Img(r-1,c-1) + 2*Median_Img(r-1,c) + Median_Img(r-1,c+1) - Median_Img(r+1,c-1) - 2*Median_Img(r+1,c) - Median_Img(r+1,c+1);
  8. Sobel_Num = abs(Sobel_x) + abs(Sobel_y);
  9. %Sobel_Num = sqrt(Sobel_x^2 + Sobel_y^2);
  10. if(Sobel_Num > Sobel_Threshold)
  11. Sobel_Img(r,c)=255;
  12. else
  13. Sobel_Img(r,c)=0;
  14. end
  15. end
  16. end
  17. figure;
  18. imshow(Sobel_Img);

膨胀操作(Dilation_img)

腐蚀膨胀是形态学图像处理的基础,腐蚀在二值图像的基础上做“收缩”或“细化”操作,膨胀在二值图像的基础上做“加长”或“变粗”的操作。

膨胀是将与物体接触的所有背景点合并到该物体中,使边界向外部扩张的过程。可以用来填补物体中的空洞。用3X3的结构元素,扫描图像的每一个像素,用结构元素与其覆盖的二值图像做“与”操作,如果都为0,结果图像的该像素为0,。否则为1。

  1. Dilation_img = zeros(ROW,COL);
  2. for r = 2:ROW-1
  3. for c = 2:COL-1
  4. or1 = bitor(Sobel_Img(r-1, c-1), bitor(Sobel_Img(r-1, c), Sobel_Img(r-1, c+1)));
  5. or2 = bitor(Sobel_Img(r, c-1), bitor(Sobel_Img(r, c), Sobel_Img(r, c+1)));
  6. or3 = bitor(Sobel_Img(r+1, c-1), bitor(Sobel_Img(r+1, c), Sobel_Img(r+1, c+1)));
  7. Dilation_img(r, c) = bitor(or1, bitor(or2, or3));
  8. end
  9. end
  10. figure;
  11. imshow(Dilation_img);

       腐蚀操作(Erosion_img)

腐蚀是一种消除边界点,使边界向内部收缩的过程。可以用来消除小且无意义的物体。用3X3的结构元素,扫描图像的每一个像素,用结构元素与其覆盖的二值图像做“与”操作,如果都为1,结果图像的该像素为1。否则为0。结果会使二值图像小一圈。

  1. Erosion_img = zeros(ROW,COL);
  2. for r = 2:ROW-1
  3. for c = 2:COL-1
  4. and1 = bitand(Dilation_img(r-1, c-1), bitand(Dilation_img(r-1, c), Dilation_img(r-1, c+1)));
  5. and2 = bitand(Dilation_img(r, c-1), bitand(Dilation_img(r, c), Dilation_img(r, c+1)));
  6. and3 = bitand(Dilation_img(r+1, c-1), bitand(Dilation_img(r+1, c), Dilation_img(r+1, c+1)));
  7. Erosion_img(r, c) = bitand(and1, bitand(and2, and3));
  8. end
  9. end
  10. figure;
  11. imshow(Erosion_img);

注:先腐蚀后膨胀叫开运算,开运算的作用是清除图像边缘周围非边缘的细小的点。

        先膨胀后腐蚀为闭运算,闭运算的作用是清除图像内部的空洞。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/375382
推荐阅读
相关标签
  

闽ICP备14008679号