实验报告3:图像的线性与非线性空间滤波
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验报告3:图像的线性与非线性空间滤波
一.浮雕效果的实现方式----线性滤波
1.浮雕效果的原理描述
实现图像浮雕效果的原理是将图像上每个像素点与其对角线的像素点形成差值,使相似颜色值淡化,不同颜色值突出,将图像中灰度值变换较大的部分的像素突出出来,并将灰度值变换不大的部分淡化,从而产生纵深感,达到类似浮雕的效果。
而产生浮雕效果的函数是线性滤波函数filter2(),该函数是一个对二维图像使用的线性滤波器;使用该函数时输入一个算子模块,并生成卷积算子,通过选择合适的滤波算子就能使得图像产生近似于相似色块内对比度加强的浮雕效果。具体的做法是取主对角线除右下角外的各点之和的平均值,减去右下角点的值,再加上填充背景色,再加上一个背景常数(一般为128)而成,会形成类似浮雕的效果。
2.浮雕特效的效果对比:
原图:对比图:
、
可以看出,原图作为一副彩色图片,其颜色分明的部分的轮廓被很好地保留了下来,并加强了对比度。本图片右下角有水印,因此水印作为外框黑色填充黄色的图形,被和背景叠加在了一起,并且边界对比度也得到了加强,然而原图是彩色图,画出的浮雕图形是黑白的,因为灰度图像显示彩色图像的浮雕效果更有真实感和立体感。
3.源代码:
YT=imread(‘yuantu.jpg’);
R=YT(:,:,1);
G=YT(:,:,2);
B=YT(:,:,3);
h=[10-1;40-4;10-1];
JR1=filter2(h,R);
JG1=filter2(h,G);
JB1=filter2(h,B);
k=[410;10-1;0-1 -4];
JR2=filter2(k,R);
JG2=filter2(k,G);
JB2=filter2(k,B);
JR=JR1+JR2;
JG=JG1+JG2;
JB=JB1+JB2;
J=JR+JG+JB;
subplot(1,2,1),imshow(YT),title(‘原图’);
subplot(1,2,2),imshow(J),title(‘浮雕效果图’);
4.代码解释:
代码首先用imread函数将图像写入,然后利用(x,y,1/2/3)的矩阵读取原图每个像素的RGB三个颜色的像素值。在这之后,用一个维度相同的H矩阵作为垂直方向算子,并用filter2函数分别对RGB的颜色分量进行浮雕效果处理。完成处理后,写入另一个k矩阵作为135度角方向的算子,并且再对RGB三个颜色分量进行浮雕效果处理,并将得到的两幅图像相加。得到JR,JG,JB三个分量后,将三个分量的数值相加,得到处理后的浮雕图像J。
接下来用subplot函数添加两块显示区域,并将两幅图片分别以“原图”和“浮雕效果图”的名字进行显示。
二.油画效果的实现方式----非线性滤波
1.油画效果的原理描述
油画效果的主要原理是通过将每一个像素变成周围边长X的矩阵内出现最多的色块颜色的方式将分界明显的颜色区域模糊化,在鲜明边界周围有大块的相同或相近颜色区域,模仿出油画的艺术效果。在提取完每个颜色及其周围矩阵内的颜色后,通过网页中给出的公式:int nCurIntensity = ( ( ( nR + nG + nB ) / 3.0 ) * fIntensityLevels_i ) / 255;
来获得每个像素点的平均模糊灰度值。算出这个颜色比例后,可以得到每个像素点和他周围的颜色强度值。每个像素的最终强度值取决于其周围最多的颜色强度值。在统计出该像素周围的颜色强度值数量后,直接选择最多的RGB颜色强度值作为该像素的处理后灰度值,并将RGB的三个数值相加。
2.油画效果的特效对比
原图:
油画效果处理后对比图:
可以看出,优化效果处理后很多原来对比度鲜明,灰度值区分区域非常明显的部分(比如图片中央的楼梯)灰度值的跳变部分由原来的小块区域变成了大块的模糊色块。而原图中很多微小的圆形光点/光晕由于灰度值的取众数效果变成了边界为直线,角上锯齿形的效果。而图像中也有一部分细节(例如航天器上面的细线和右下角地面上的白色虚线)也由于相同灰度值宽度不够导致不足以被记录下来,因此这种油画效果的算法可能会导致部分细节的缺失。
3.源代码:
function [I_painted]=OilPaint(I_rgb, radius, intensity_level)
[filename pathname]=uigetfile({'*.jpg';'*.bmp';'*.*'},'读入文件');
pathfile=[pathname filename];
handles.pic=imread(pathfile);
intensity_level = 180;
radius = 5;
s1=size(handles.pic);
width=s1(1);
height=s1(2);
I_painted=uint8(zeros(width,height));
I=rgb2gray(handles.pic);
% down-sampling the intensity image
I= floor(I* (intensity_level/255));
tic
for x = 1:width
for y = 1:height
clear intensity_counter R G B max_instance index
intensity_counter=uint8(zeros(1,intensity_level+1));
R=uint8(zeros(1,intensity_level+1));
G=uint8(zeros(1,intensity_level+1));
B=uint8(zeros(1,intensity_level+1));
for i = (x-radius):(x+radius)
for j = (y-radius):(y+radius)
if i>0 && i<=width && j>0 && j<=height
intensity = I(i,j)+1;
intensity_counter(intensity)=intensity_counter(intensity)+1;
R(intensity) = handles.pic(i,j,1);
G(intensity) = handles.pic(i,j,2);
B(intensity) = handles.pic(i,j,3);
end
end
end
[max_intensity index] = max(intensity_counter);
I_painted(x, y, 1)= R(index);
I_painted(x, y, 2)= G(index);
I_painted(x, y, 3)= B(index);
end
end
toc
figure
imshow(I_painted,[]);title('油画效果');