%之前写的一个程序,这里面用Sobel算子和Prewitt算子的部分就是对图像锐化得到边缘的了。也可以直接用matlab自带的函数S = edge(I, 'sobel')进行锐化。
clcclose all
clear all
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%读入图像
f=imread('Pictures/4_m03.tif')
%f=imread('Pictures/5_m01.tif')
%f=imread('Pictures/10_m02.tif')
%f=imread('Pictures/22_m03.tif')
f=imresize(f,0.25)
f=im2double(f)
[m,n]=size(f)
subplot(2,3,1),imshow(f)
title('原始图像')
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%生成高斯平滑滤波模板
hg=zeros(3,3) %设定模板大小3*3
delta=0.5
for x=1:1:3
for y=1:1:3
u=x-2
v=y-2
hg(x,y)=exp(-(u^2+v^2)/(2*pi*delta^2))
end
end
h=hg/sum(hg(:))
%高斯滤波
ftemp=zeros(m,n)
rowhigh=m-1
colhigh=n-1
for x=2:1:rowhigh-1
for y=2:1:colhigh-1
mod=[f(x-1,y-1) f(x-1,y) f(x-1,y+1) f(x,y-1) f(x,y) f(x,y+1)f(x+1,y-1) f(x+1,y) f(x+1,y+1)]
A=h.*mod
ftemp(x,y)=sum(A(:))
end
end
f=ftemp
subplot(2,3,4),imshow(f)
title('高斯滤波后的图像')
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%利用Sobel算子进行边缘检测
sx=[-1 0 1-2 0 2-1 0 1]
sy=[-1 -2 -10 0 01 2 1]
for x=2:1:rowhigh-1
for y=2:1:colhigh-1
mod=[f(x-1,y-1) f(x-1,y) f(x-1,y+1) f(x,y-1) f(x,y) f(x,y+1)f(x+1,y-1) f(x+1,y) f(x+1,y+1)]
fsx=sx.*mod
fsy=sy.*mod
ftemp(x,y)=max((abs(sum(fsx(:)))),(abs(sum(fsy(:)))))
end
end
fs=im2uint8(ftemp)
subplot(2,3,2),imshow(fs)
title('Sobel算子进行边缘检测的原始图像')
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%阈值分割
TH1=140 %设定阈值
for x=2:1:rowhigh-1
for y=2:1:colhigh-1
if (fs(x,y)>=TH1)&((fs(x,y-1) <= fs(x,y)) & (fs(x,y) > fs(x,y+1)) )
fs(x,y)=200
elseif(fs(x,y)>=TH1)&( (fs(x-1,y) <=fs(x,y)) & (fs(x,y) >fs(x+1,y)))
fs(x,y)=200
else fs(x,y)=50
end
end
end
subplot(2,3,5),imshow(fs)
title('Sobel算子边缘检测并细化后的图像')
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%利用Prewitt算子进行边缘检测
sx=[1 0 -11 0 -11 0 -1]
sy=[-1 -1 -10 0 01 1 1]
for x=2:1:rowhigh-1
for y=2:1:colhigh-1
mod=[f(x-1,y-1) f(x-1,y) f(x-1,y+1) f(x,y-1) f(x,y) f(x,y+1)f(x+1,y-1) f(x+1,y) f(x+1,y+1)]
fsx=sx.*mod
fsy=sy.*mod
ftemp(x,y)=max((abs(sum(fsx(:)))),(abs(sum(fsy(:)))))
end
end
fs=im2uint8(ftemp)
subplot(2,3,3),imshow(fs)
title('Prewitt算子进行边缘检测的原始图像')
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%阈值分割
TH1=100 %设定阈值
for x=2:1:rowhigh-1
for y=2:1:colhigh-1
if (fs(x,y)>=TH1)&((fs(x,y-1) <= fs(x,y)) & (fs(x,y) > fs(x,y+1)) )
fs(x,y)=200
elseif(fs(x,y)>=TH1)&( (fs(x-1,y) <=fs(x,y)) & (fs(x,y) >fs(x+1,y)))
fs(x,y)=200
else fs(x,y)=50
end
end
end
subplot(2,3,6),imshow(fs)
title('Prewitt算子边缘检测并细化后的图像')
锐化(Sharpening) 常用的照片锐化方法一共有两种,请读者切记这两种方法是不可以混合使用的。照片的光学锐度有镜头和传感器的质量决定;软件锐度其实是模拟光学锐度的效果,通过提高画面的边缘对比度,使照片看上去锐度更高。软件锐化必须在已有照片解像度的基础上进行,不能创造照片细节,只能突出原有细节。原照片放大2倍注释锐化前边缘较软锐化后边缘变得锐利由于过度锐化而产生的晕轮 从上面的例子来看,适度的锐化能让画面的边缘更加干净和清晰。相反,过分的锐化会令物体边缘位置出现一个晕轮,让人看得很不舒服。这种锐化方法通过创造一个白色的外部圆形晕轮(使圆圈边缘附近的浅灰色背景更光亮)和一个黑色的内部圆形晕轮(使圆圈边缘附近的深灰色象素颜色更加暗)来实现锐化的目的。由于白晕轮与黑晕轮之间的对比度,比浅灰色背景与深灰色圆圈的对比度高,因此能给人一个“画面便锐利了”的“错觉”。但是,这种晕轮如果明显出现在照片中,会影响照片的成像效果。然而,这种晕轮往往是非常难以消除的,除非你用RAW格式拍摄照片(见以下内容)。照内锐化 作为照片处理程序的一个默认部分,数码相机会自动对拍摄的照片进行不同程度的锐化,以消除颜色过滤排列装置解码的过程中(该过程会轻微降低画面细节锐度),细节锐利度的损失。然而,过度的照相机内锐化会产生难以消除的晕轮,增加可见锯齿、噪点和其他非自然痕迹。准专业级数码相机和数码单反可以让用户选择照相机内锐化的程度,甚至对图像处理器发出“不进行锐化”的指令。软件锐化 如果照相机为用户提供了拍摄RAW格式照片的功能,用户可以关闭照相机内的锐化程序,直接把照片传到电脑后再用软件进行锐化。软件锐化让我们能够按照照片输出的目的,自由选择锐化的程度,避免讨厌的晕轮产生。例如,当你想把照片放在显示器上浏览或放在网络上与别人分享的时候,你需要把照片锐度提高,展现照片的精彩细节;当你想把照片打印出来的时候,你只需要轻轻的锐化照片,因为过度的锐化会使印出来的照片看上去不真实。如果你的照相机没有RAW格式输出,或者你只想使用JPEG格式,请尽量使用照相机内锐化,因为电脑上的软件的锐化效果通常比不上照相机内图像处理器的锐化效果。原因之一是照相机内锐化是在照片被压缩成JPEG格式之前完成的,而软件锐化只能对经过压缩的JPEG照片进行锐化,后者的锐化会使JPEG的压缩痕迹更加明显。如果觉得照相机内锐化的效果还不够明显,当然你可以后期用软件再进行锐化。但请读者切记一点:把照片锐化容易,但是要消除过度锐化的痕迹就非常困难了。程序如下:A=imread('f:\lena.bmp')
figure(1)
subplot(1,2,1)
imshow(A)
title('原图')
I=double(A)
h=[-1 -1 -1-1 9 -1-1 -1 -1]
J=conv2(I,h,'same')
K=uint8(J)
subplot(1,2,2)
imshow(K)
title('使用拉普拉斯算子锐化处理后的图')
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)