浮雕与油画效果实现(matlab)

上传人:go****e 文档编号:137239726 上传时间:2020-07-06 格式:PDF 页数:8 大小:226.06KB
返回 下载 相关 举报
浮雕与油画效果实现(matlab)_第1页
第1页 / 共8页
浮雕与油画效果实现(matlab)_第2页
第2页 / 共8页
浮雕与油画效果实现(matlab)_第3页
第3页 / 共8页
浮雕与油画效果实现(matlab)_第4页
第4页 / 共8页
浮雕与油画效果实现(matlab)_第5页
第5页 / 共8页
点击查看更多>>
资源描述

《浮雕与油画效果实现(matlab)》由会员分享,可在线阅读,更多相关《浮雕与油画效果实现(matlab)(8页珍藏版)》请在金锄头文库上搜索。

1、利用滤波实现油画的浮雕和油画效果 一.浮雕效果 1.原理: 将图片的颜色或灰度变换较大的像素部分突出出来, 而将灰度或颜色 变换不大的部分淡化,使图像出现纵深感,从而达到浮雕效果。利用 matlab 的线性滤波函数 filter2(),以及水平,垂直,45 度,135 度方 向的算子进行滤波,最后叠加起来可以得到较好的浮雕效果。 2.matlab 代码:(main1.m) filename, pathname = uigetfile(*.bmp;*.jpg;*.png;*.jpeg, Image Files (*.bmp, *.jpg, *.png,*.jpeg); . *.*, All Fi

2、les (*.*),Pick an image); if isequal(filename,0) | isequal(pathname,0), return; end %获取图片路径 path=fullfile(pathname,filename); RGB=imread(path);%读取一张图片 R=RGB(:,:,1);%红色分量表示的图像 G=RGB(:,:,2);%绿色分量表示的图像 B=RGB(:,:,3);%蓝色分量表示的图像 h1=-1,-4,-1;0,0,0;1,4,1;%水平方向算子 IR1=filter2(h1,R);%对红色分量进行浮雕效果处理 IG1=filter2(

3、h1,G);%对绿色分量进行浮雕效果处理 IB1=filter2(h1,B);%对蓝色分量进行浮雕效果处理 h2=1,0,-1;4,0,-1;1,0,-1;%垂直方向算子 IR2=filter2(h2,R); IG2=filter2(h2,G); IB2=filter2(h2,B); h3=0,-1,-4;1,0,-1;1,4,0;%45 度方向算子 IR3=filter2(h3,R); IG3=filter2(h3,G); IB3=filter2(h3,B); h4=4,1,0;1,0,-1;0,-1,-4;%135 度方向算子 IR4=filter2(h4,R); IG4=filter2(

4、h4,G); IB4=filter2(h4,B); IR=IR1+IR2+IR3+IR4; IG=IG1+IG2+IG3+IG4; IB=IB1+IB2+IB3+IB4; IMG=IR+IG+IB;%对 rgb 三个分量单独处理后的图像进行叠加 subplot(1,2,1),imshow(RGB),title(原图); subplot(1,2,2),imshow(IMG,),title(浮雕效果图); 3.实验结果: 4.问题与思考: 通过以上算法只能实现水平,垂直,45 度和 135 度这四个方向上的 浮雕效果, 如何实现其它任意方向的浮雕效果?根据任意方向的导数 算法, 我们可以使用多方向

5、的梯度算法和拉普拉斯变换算法输出任意 原 图浮 雕 效 果 图 方向最佳的边缘响应。其实,梯度算法和拉普拉斯算法输出的是 0180 度范围垂直方向对的最大响应,即: B=max(|dn/dx |+|dn/dy|) B=max(|d2n/dx2|+|d2n/dy2|) 二.油画效果 1.基本原理:检测图像每个像素的邻域,计算每个邻域像素的强 度(亮度),取重复出现最多的值相对应的像素作为输出,分别取这 些像素的 r,g,b 分量的平均值作为当前像素输出的 r,g,b 值,最 终得到的图像会损失一些信息,得到类似油画的效果。 2.具体算法分析: 对于一副图像,例如: (1)确定当前像素位置为(x,

6、y),取邻域半径为 2,则邻域范围 是从x-2,y-2到x+2,y+2,如图:图中标出每个像素的 r,g,b 值。 (2)计算每个邻域像素的强度值,计算公式为: 强度值=(r 值+g 值+b 值)/3*强度范围/255,其中强度范围 是可调整的参数(该例子取值为 20)。结果如图: 其中,强度值 8 出现次数最多,为 7 次,对应的像素位置分别为: x-1,y-2, x,y-1, x,y+1, x+1,y-1, x+1,y, x+1,y+2, x+2,y+2 (3)取这 7 个像素 r 分量的平均值作为输出像素 r 分量的值: R=(124+120+158+129+108+170+140)/7

7、=135, 同理,可求出输出像素 g 分量和 b 分量的值,分别为 128,65. (4)则当前像素(x,y)对应的输出值为:RGB(135,128,65)。 (5)改变当前像素位置,重复以上步骤等到每一个像素的输出值, 最终输出的图像就具有油画效果。 3.算法参数分析: 邻域半径:确定邻域范围,取 3 到 7 可以得到较好的油画效果 强度范围:用来计算邻域像素的强度,从而达到筛选输出的目的 4.matlab 代码: oilpaint.m: function outputimage=oilpaint(image,radius,intensity_level) %image 输入的图片数组 %r

8、adius 滤波邻域的半径 %intensity_level 强度范围,由于计算像素强度 %outputimage 输出的图片数组 image=uint16(image); %将输入的图片数组转为 uint16 型,避免计算时超出范围 image_size=size(image); height=image_size(1); %图片的高度 width=image_size(2); %图片的宽度 outputimage=zeros(height,width,3); %用一个同样大小的数组记录输出图像的数据,初始化为零 for x=1:height for y=1:width intensity_

9、counter=zeros(intensity_level,1); %强度计数器,记录邻域每个强度出现次数 sum_r=uint16(zeros(intensity_level,1); %r 分量累加器,记录每个强度 r 分量的和 sum_g=uint16(zeros(intensity_level,1); %g 分量累加器 sum_b=uint16(zeros(intensity_level,1); %b 分量累加器 for i=(x-radius):(x+radius) for j=(y-radius):(y+radius) %邻域的遍历 if i0 %计算每一像素的强度 if inten

10、sity=0 intensity=1; end %强度不能为零,避免数组下标出现零 intensity_counter(intensity)=intensity_counter(intensity)+1; %统计强度出现的次数 sum_r(intensity)=sum_r(intensity)+image(i,j,1); %同一强度的 r 分量求和 sum_g(intensity)=sum_g(intensity)+image(i,j,2); sum_b(intensity)=sum_b(intensity)+image(i,j,3); end end end intensity_counte

11、r_max=max(intensity_counter); %找出同一强度出现最多的次数 for i=1:intensity_level if intensity_counter(i)=intensity_counter_max index=i; end end %若出现最多的次数有重复,则取强度大的像素作为输出 outputimage(x,y,1)=sum_r(index)/intensity_counter(index); %出现最多次的强度值对应像素的 r 分量取平均值,作为当前像素输出的 r 分量 outputimage(x,y,2)=sum_g(index)/intensity_co

12、unter(index); %输出的 g 分量 outputimage(x,y,3)=sum_b(index)/intensity_counter(index); %输出的 b 分量 end end outputimage=uint8(outputimage);%将 uint16 图像转化为 matlab 默认的 uint8 型 main.m: filename, pathname = uigetfile(*.bmp;*.jpg;*.png;*.jpeg, Image Files (*.bmp, *.jpg, *.png,*.jpeg); . *.*, All Files (*.*),Pick

13、 an image); if isequal(filename,0) | isequal(pathname,0), return; end %获取图片路径 path=fullfile(pathname,filename); image=imread(path);%读取一张图片 outputimage=oilpaint(image,5,100);%通过滤波进行油画效果处理 subplot(1,2,1) imshow(image); title(原图); subplot(1,2,2); imshow(outputimage); title(油画效果图); 5.实验结果: 原 图油 画 效 果 图 6.实现过程中的问题与思考: (1) 边界问题: 这是一个非线性滤波, 关键是强度重复像素的计算, 不必进行边界的扩展。如果边界上补零,那么输出图片会有黑边;如 果采用复制外边界来扩展,那么输出边界就是原图的边界;如果边界 采用对称扩展或周期扩展, 输出的油画效果和不采用边界扩展几乎没 有是一样的。 (2)数据类型问题 :matlab 读取图片时默认为 uint8 类型的数组, 但是在计算像素强度的过程中出现了远大于 255 的值,所以必须将 uint8 数组转换为 uint16 的数组进行计算分析,最后的结果再转换为 uint8 性的数组输出。 原 图油 画 效 果 图

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 幼儿/小学教育 > 其它小学文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号