赞
踩
MATLAB即矩阵实验室(matrix laboratory),我们都知道一副图片的像素数据可以看成是一个二维数组一个大矩阵,所以MTABLAB就是用来矩阵运算,这篇文章主要是根据原理用MATLAB实现一些图像处理的基础算法,作为使用FPGA实现各种图像处理算法的前期仿真,为下一步写电路奠定基础。
原始的RGB图像(RGB_data)
- clc;
- clear all;
- close all;
-
- RGB_data = imread('l.jpg');
-
- R_data = RGB_data(:,:,1);
- G_data = RGB_data(:,:,2);
- B_data = RGB_data(:,:,3);
-
- imshow(RGB_data);
灰度图像(Gray_data)
要将RGB转化为YCbCr格式,需要将Y分量提取出来,Y分量表示的是图像的亮度和浓度得到的图像就是灰度图像。其中YCbCr是通过有序的三元组来表示的,三元由Y(Luminance)、Cb(Chrominance-Blue)和Cr(Chrominance-Red)组成,其中Y表示颜色的明亮度和浓度,而Cb和Cr则分别表示颜色的蓝色浓度偏移量和红色浓度偏移量。
算法公式
- [ROW,COL, DIM] = size(RGB_data);
-
- Y_data = zeros(ROW,COL);
- Cb_data = zeros(ROW,COL);
- Cr_data = zeros(ROW,COL);
- Gray_data = RGB_data;
-
- for r = 1:ROW
- for c = 1:COL
- Y_data(r, c) = 0.299*R_data(r, c) + 0.587*G_data(r, c) + 0.114*B_data(r, c);
- Cb_data(r, c) = -0.172*R_data(r, c) - 0.339*G_data(r, c) + 0.511*B_data(r, c) + 128;
- Cr_data(r, c) = 0.511*R_data(r, c) - 0.428*G_data(r, c) - 0.083*B_data(r, c) + 128;
- end
- end
- Gray_data(:,:,1)=Y_data;
- Gray_data(:,:,2)=Y_data;
- Gray_data(:,:,3)=Y_data;
-
- figure;
- imshow(Gray_data)
加椒盐噪声的图像(imgn)
椒盐噪声就是在图像上随机出现黑色白色的像素。椒盐噪声是一种因为信号脉冲强度引起的噪声。
- imgn = imnoise(Gray_data,'salt & pepper',0.02);
-
- figure;
- imshow(imgn);
对加椒盐噪声的图像进行中值滤波处理(Median_Img)
中值滤波方法是,对待处理的当前像素,选择一个模板3x3矩阵,该模板为其邻近的若干个像素组成,对模板的像素由小到大进行排序,再用模板的中值来替代原像素的值的方法。
排序算法
(1)对窗内的每行像素按降序排序,得到最大值、中间值和最小值。
(2)把三行的最小值即第三列相比较,取其中的最大值。
(3)把三行的最大值即第一列相比较,取其中的最小值。
(4)把三行的中间值即第二列相比较,再取一次中间值。
(5)把前面的到的三个值再做一次排序,获得的中值即该窗口的中值。
- Median_Img = Gray_data;
- for r = 2:ROW-1
- for c = 2:COL-1
- median3x3 =[imgn(r-1,c-1) imgn(r-1,c) imgn(r-1,c+1)
- imgn(r,c-1) imgn(r,c) imgn(r,c+1)
- imgn(r+1,c-1) imgn(r+1,c) imgn(r+1,c+1)];
- sort1 = sort(median3x3, 2, 'descend');
- sort2 = sort([sort1(1), sort1(4), sort1(7)], 'descend');
- sort3 = sort([sort1(2), sort1(5), sort1(8)], 'descend');
- sort4 = sort([sort1(3), sort1(6), sort1(9)], 'descend');
- mid_num = sort([sort2(3), sort3(2), sort4(1)], 'descend');
- Median_Img(r,c) = mid_num(2);
- end
- end
-
- figure;
- 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。
- Median_Img = double(Median_Img);
- Sobel_Threshold = 150;
- Sobel_Img = zeros(ROW,COL);
-
- for r = 2:ROW-1
- for c = 2:COL-1
- 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);
- 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);
- Sobel_Num = abs(Sobel_x) + abs(Sobel_y);
- %Sobel_Num = sqrt(Sobel_x^2 + Sobel_y^2);
- if(Sobel_Num > Sobel_Threshold)
- Sobel_Img(r,c)=255;
- else
- Sobel_Img(r,c)=0;
- end
- end
- end
-
- figure;
- imshow(Sobel_Img);
膨胀操作(Dilation_img)
腐蚀膨胀是形态学图像处理的基础,腐蚀在二值图像的基础上做“收缩”或“细化”操作,膨胀在二值图像的基础上做“加长”或“变粗”的操作。
膨胀是将与物体接触的所有背景点合并到该物体中,使边界向外部扩张的过程。可以用来填补物体中的空洞。用3X3的结构元素,扫描图像的每一个像素,用结构元素与其覆盖的二值图像做“与”操作,如果都为0,结果图像的该像素为0,。否则为1。
- Dilation_img = zeros(ROW,COL);
- for r = 2:ROW-1
- for c = 2:COL-1
- or1 = bitor(Sobel_Img(r-1, c-1), bitor(Sobel_Img(r-1, c), Sobel_Img(r-1, c+1)));
- or2 = bitor(Sobel_Img(r, c-1), bitor(Sobel_Img(r, c), Sobel_Img(r, c+1)));
- or3 = bitor(Sobel_Img(r+1, c-1), bitor(Sobel_Img(r+1, c), Sobel_Img(r+1, c+1)));
- Dilation_img(r, c) = bitor(or1, bitor(or2, or3));
- end
- end
-
- figure;
- imshow(Dilation_img);
腐蚀操作(Erosion_img)
腐蚀是一种消除边界点,使边界向内部收缩的过程。可以用来消除小且无意义的物体。用3X3的结构元素,扫描图像的每一个像素,用结构元素与其覆盖的二值图像做“与”操作,如果都为1,结果图像的该像素为1。否则为0。结果会使二值图像小一圈。
- Erosion_img = zeros(ROW,COL);
- for r = 2:ROW-1
- for c = 2:COL-1
- and1 = bitand(Dilation_img(r-1, c-1), bitand(Dilation_img(r-1, c), Dilation_img(r-1, c+1)));
- and2 = bitand(Dilation_img(r, c-1), bitand(Dilation_img(r, c), Dilation_img(r, c+1)));
- and3 = bitand(Dilation_img(r+1, c-1), bitand(Dilation_img(r+1, c), Dilation_img(r+1, c+1)));
- Erosion_img(r, c) = bitand(and1, bitand(and2, and3));
- end
- end
-
- figure;
- imshow(Erosion_img);
注:先腐蚀后膨胀叫开运算,开运算的作用是清除图像边缘周围非边缘的细小的点。
先膨胀后腐蚀为闭运算,闭运算的作用是清除图像内部的空洞。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。