扯一点题外话,这一个月经历了太多,接连感染了甲流、乙流,人都快烧没了,乙流最为严重,烧了一个星期的38-39度,咳嗽咳到虚脱。还是需要保护好身体,感觉身体扛不住几次连续发烧!(甲流乙流是病毒,提前准备好奥司他韦,这个是阻断病毒复制的药,48小时内效果是最明显的,不要像我一样等到中招了,才匆忙去买,送了3天,过了最佳时间.......)
———————————————————————————————————————————
首先,我们还是先引入一个概念,图像处理操作包括:转换操作、赋值操作、变换操作、逻辑操作、过滤操作。(过滤操作就是本节主体)
转换操作:
转换操作将输入图像转换为另外一种格式,比如说RGB图像转为灰度图像,灰度图像转为二值图像。 RGB转为灰度利用公式::
在最前面的几节里面,我们了解到了RGB图像是3通道图像,一个像素的颜色由R、G、B决定。如果我们想从RGB转为灰度图像,就可以利用上面的公式实现。
灰度图像转为二值图像就是利用二值化,设定一个阈值,小于阈值为0,大于阈值为1,在之前的几节里面我们也是涉及到了的。
赋值操作:
初始化:将图像中所有的像素的灰度值赋值为某一个常数,这个里面必须要明确的是图像高度和宽度。
复制:将输入图像的每个像素灰度值复制输出到输出图像像素的灰度值中。
反转:灰度值的变换,假如一个图像灰度值范围为[0-255],设图像的一个像素的灰度值为x,图像反转后的 灰度值为Y=255-X
变换操作:
变换操作通常涉及到输入图像的频率域,空间域到频率域的转换需要傅里叶变换。
过滤操作:
过滤操作描述:为使用正方形、矩形或线性过滤矩阵对输入图像进行卷积。
滤波器包括:平均、高斯、水平prewitt、垂直prewitt、水平Sobel、垂直Sobel、拉普拉斯算子、锐 化、中值滤波。
在我看来,对于一个滤波器来说,最能体现出滤波器的特点的地方应该是内核的元素的值。后面的不同滤波器代码可能都只是修改了内核的值。由于内容比较多,动手去实现就非常好理解!
平均滤波:平均过滤器旨在消除噪声
matlab代码如下:
clear; n = 5; I = imread('1.tif'); j = imnoise(I,'salt',0.02); [height,width] = size(j); FilterMid = j; for row = (n+1)/2: height-(n-1)/2 for col = (n+1)/2:width-(n-1)/2 temp = double(j(row-((n-1)/2):row+((n-1)/2),col-((n-1)/2):col+((n-1)/2))); template2 = sort(temp(:)); FilterMid(row,col) = template2((n*n+1)/2); end end figure,subplot(1,3,1),imshow(I),title('原图像'); subplot(1,3,2),imshow(j),title('椒盐处理后的图像'); subplot(1,3,3),imshow(FilterMid),title('中值滤波后图像');
处理结果如下:
高斯滤波:线性平滑滤波器,利用的是加权平均的处理方法,权重利用的是距离的远近,距离越近权重越大,也就是说对中心像素点的像素值生成影响越大。
代码如下:
clear,clc; Img = imread('1.tif'); M = size(Img); if numel(M)>2%判断灰度图像还是彩色图像 gray = rgb2gray(Img); else gray = Img; end %创建滤波器 I = imnoise(gray,'salt',0.02); W =fspecial('gaussian',[5,5],1); G = imfilter(I,W,'replicate'); figure subplot(1,3,1),imshow(gray),title('原图像'); subplot(1,3,2),imshow(I),title('加了噪声图像'); subplot(1,3,3),imshow(G),title('高斯滤波器处理后图像');
运行结果如下:
水平prewitt :水平Prewitt操作类似梯度滤波器一样,梯度滤波器也叫边缘滤波器,具有通过被考察像素某 一个方向的灰度变化的梯度(即出现突变的地方),找到边缘位置的作用,主打一个突出水平边缘效果。
垂直prewitt :垂直prewitt具有突出图像垂直边缘的效果。
matlab代码如下:
clear; F = imread('1.png'); F = rgb2gray(F); f = double(F); [row,col] = size(f); f1 = zeros(row,col); f2 = zeros(row,col); f3 = zeros(row,col); gy = [1,0,-1;1,0,-1;1,0,-1]; gx = [-1,-1,-1;0,0,0;1,1,1]; for i=2:row-1 for j=2:col-1 fx = [f(i-1,j-1),f(i-1,j),f(i-1,j+1);f(i,j-1),f(i,j),f(i,j+1);f(i+1,j1),f(i+1,j),f(i+1,j+1)]; fy = [f(i-1,j-1),f(i-1,j),f(i-1,j+1);f(i,j-1),f(i,j),f(i,j+1);f(i+1,j1),f(i+1,j),f(i+1,j+1)]; Gx = gx.*fx; Gy = gy.*fy; A = abs(sum(Gx(:))); B = abs(sum(Gy(:))); C = ((sum(Gx(:)))^2+(sum(Gy(:)))^2)^0.5; if A >= 50//50为阈值,后面B、C同理 f1(i,j) = 255; end if B >= 50 f2(i,j) = 255; end if C >=50 f3(i,j) = 255; end end end figure subplot(2,2,1),imshow(F),title('原图像'); subplot(2,2,2),imshow(f1),title('水平prewitt'); subplot(2,2,3),imshow(f2),title('垂直prewitt'); subplot(2,2,4),imshow(f3),title('水平且垂直prewitt');
运行结果如下:
阈值的设置需要不断去调整,没有说固定的最佳的阈值。
Sobel:
水平Sobel:同理于prewitt算子,可以突出水平边缘,但是却通过与中心像素点的距离修改了影响的参数。
垂直sobel同样如此。
matlab代码如下:
clear; F = imread('1.bmp'); F = rgb2gray(F); f = double(F); [row,col] = size(f); f1 = zeros(row,col); f2 = zeros(row,col); f3 = zeros(row,col); gx = [-1,-2,-1;0,0,0;1,2,1]; gy = [1,0,-1;2,0,-2;1,0,-1]; for i=2:row-1 for j=2:col-1 fx = [f(i-1,j-1),f(i-1,j),f(i-1,j+1);f(i,j-1),f(i,j),f(i,j+1);f(i+1,j1),f(i+1,j),f(i+1,j+1)]; fy = [f(i-1,j-1),f(i-1,j),f(i-1,j+1);f(i,j-1),f(i,j),f(i,j+1);f(i+1,j1),f(i+1,j),f(i+1,j+1)]; Gx = gx.*fx; Gy = gy.*fy; A = abs(sum(Gx(:))); B = abs(sum(Gy(:))); C = ((sum(Gx(:)))^2+(sum(Gy(:)))^2)^0.5; if A >= 50 f1(i,j) = 255; end if B >= 50 f2(i,j) = 255; end if C >=50 f3(i,j) = 255; end end end figure subplot(2,2,1),imshow(F),title('原图像'); subplot(2,2,2),imshow(f1),title('水平sobel'); subplot(2,2,3),imshow(f2),title('垂直sobel'); subplot(2,2,4),imshow(f3),title('水平且垂直sobel');
运行结果如下:
拉普拉斯算子:
二阶导数算子,作用是突出边缘效果,也就是锐化的效果
matlab代码如下:
clear; img= imread('1.bmp'); %I = rgb2gray(img); I= im2double(img); [m,n]=size(I); result =zeros(size(I)); laplace = [-1,-1,-1;-1,8,-1;-1,-1,-1]; for i= 2:m-1 for j= 2:n-1 f = [I(i-1,j-1),I(i-1,j),I(i-1,j+1);I(i,j-1),I(i,j),I(i,j+1);I(i+1,j1),I(i+1,j),I(i+1,j+1)]; G= laplace.*f; result(i,j)= abs(sum(G(:))); end end img = im2uint8(img); result = im2uint8(result); figure subplot(1,2,1),imshow(img),title('原图像'); subplot(1,2,2),imshow(result),title('拉普拉斯处理后图像');
运行结果如下:
锐化低和锐化图像:
锐化:突出边缘
锐化低:突出边缘的同时平滑图像
代码如下:
clear; img= imread('1.bmp'); %I = rgb2gray(img); I= im2double(img); [m,n]=size(I); result =zeros(size(I)); result1 = zeros(size(I)); result2 = zeros(size(I)); laplace = [-1,-1,-1;-1,8,-1;-1,-1,-1]; sharpen = [-1,-1,-1;-1,9,-1;-1,-1,-1]; sharpen_low = [-1/8,-1/8,-1/8;-1/8,2,-1/8;-1/8,-1/8,-1/8]; for i= 2:m-1 for j= 2:n-1 f = [I(i-1,j-1),I(i-1,j),I(i-1,j+1);I(i,j-1),I(i,j),I(i,j+1);I(i+1,j1),I(i+1,j),I(i+1,j+1)]; G= laplace.*f; G2 = sharpen.*f; G3 =sharpen_low.*f; result(i,j)= abs(sum(G(:))); result1(i,j)= abs(sum(G2(:))); result2(i,j)= abs(sum(G3(:))); end end img = im2uint8(img); result = im2uint8(result); result1 = im2uint8(result1); result2 = im2uint8(result2); figure subplot(2,2,1),imshow(img),title('原图像'); subplot(2,2,2),imshow(result),title('拉普拉斯处理后图像'); subplot(2,2,3),imshow(result1),title('锐化处理图像'); subplot(2,2,4),imshow(result2),title('锐化低处理图像');
结果如下:
中值滤波:取内核的中值作为中心元素的值。
代码如下:
clear; n = 5; img = imread('1.bmp'); j = imnoise(img,'salt',0.02); [height,width] = size(j); FilterMid = j; for row = (n+1)/2:height-(n-1)/2 for col = (n+1)/2:width-(n-1)/2 temp = double(j(row-((n-1)/2):row+((n-1)/2),col-((n-1)/2):col+((n-1)/2))); template2 = sort(temp(:)); FilterMid(row,col)= template2((n*n+1)/2); end end figure subplot(1,3,1),imshow(img),title('原图像'); subplot(1,3,2),imshow(j),title('加入椒盐噪声的图像'); subplot(1,3,3),imshow(FilterMid),title('中值滤波处理后的图像');
运行结果如下:
均值滤波:取内核的均值作为中心元素的值
代码如下:
clear; clc; fn=imread('1.bmp'); f=imnoise(fn,'salt',0.02); [row,col]=size(f); f1 = zeros(row,col); for i=2:row-1 for j=2:col-1 f2 =[f(i-1,j-1),f(i-1,j),f(i-1,j+1);f(i,j-1),f(i,j),f(i,j+1);f(i+1,j1),f(i+1,j),f(i+1,j+1)]; f1(i,j) = mean((f2(:))); end end f1= round(f1); %f1 = double2uint8(f1); imshow(f1); figure subplot(1,3,1),imshow(fn),title('原图像'); subplot(1,3,2),imshow(f),title('加入噪声的图像'); subplot(1,3,3),imshow(f1,[0,255]),title('均值滤波处理后的图像');
运行结果如下:
建议去动手实现一下!