数字图像处理4-浮雕与油画效果,线型与非线性空间滤波
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
原图
45 度-135 度浮雕效果
70 度-160 度浮雕效果
这里取一张灰度图像来体现浮雕的效果。可以看出,浮雕效果的体现 其实就是在边界处产生光照或阴影的效果, 使得图像不同的颜色的色 块看起来呈现出不同程度的凸出或凹陷。 在 MATLAB 中需要采用图像 滤波的方法来实现这个效果。 45 度~135 度浮雕效果生成的代码如下:
光线照过来的方向,反之负数的方向就是浮雕中阴影的方向。这样, 该程序生成的效果就是把原图浮雕化后,光线分别从 45 度和 135 度 照射过来的效果。两个方向同时打光的效果可以让浮雕的效果更真 实,如果只打一个方向的光阴影和光线都会十分明显,但是使图像本 身就变得不真实了。 在此基础上,参考老师给的文献,很容易得出任意方向浮雕的实现代 码,此处以 70 度~160 度举例:
end [sum,sun]=sort(sum); finalR=sumR(sun(intensity+1))/sum(intensity+1); finalG=sumG(sun(intensity+1))/sum(intensity+1); finalB=sumB(sun(intensity+1))/sum(intensity+1); out(i,j,1)=finalR; out(i,j,2)=finalG; out(i,j,3)=finalB; for h=1:intensity+1 sumR(h)=0; sumG(h)=0; sumB(h)=0; sum(h)=0; end end end out1=uint8(out); imshow(out1);
原图
油画效果 1
油画效果 2
油画效果 3
如上所示,可以看出油画效果对比原图来看,细节不是那么突出了, 边界更加圆滑,图像更像是用一个个色块拼成的效果。其算法并不是 用普通的滤波器实现的,而是由更复杂的非线性算法实现的,下面通 过讲解代码的方式来进行算法的解释。代码如下:
I=imread('timg1.jpg'); I=uint16(I); out=I; [m,n,z]=size(I); r=3; intensity=20; for i=1:intensity+1 sumR(i)=0; sumG(i)=0; sumB(i)=0; sum(i)=0; end for i=1:m for j=1:n for k=i-r:i+r pet=0; for l=j-r:j+r if(k>0&&k<=m&&l>0&&l<=n) R=I(k,l,1); G=I(k,l,2); B=I(k,l,3); pIns=fix((( R + G + B )/3.0)*intensity/255)+1; sumR(pIns)=sumR(pIns)+R; sumG(pIns)=sumG(pIns)+G; sumB(pIns)=sumB(pIns)+B; sum(pIns)=sum(pIns)+1; end end
I=imread('timg.jpg');%读入图像 a=70; h=[-sin(a)-cos(a),-cos(a),sin(a)-cos(a);-sin(a),0,sin(a);-sin(a)+cos( a),cos(a),sin(a)+cos(a)];%a 方向算子 J=filter2(h,I);%调用滤波函数 a=a+90; h=[-sin(a)-cos(a),-cos(a),sin(a)-cos(a);-sin(a),0,sin(a);-sin(a)+cos( a),cos(a),sin(a)+cos(a)];%a+90°方向算子 B=filter2(h,I);%调用滤波函数 H=J+B; imshow(I),title('原图'); figure,imshow(H,[]),title('浮雕效果图');%在新窗口中显示效果图
原理图
如上,根据图中公式,很简单的就可以算出任意方向的浮雕对应的滤 波器。 经过试验也可以很容易看出, 其矩阵中的值会根据 a 值的不同, 运算出该加强哪个方向的像素亮度,减少哪个方向的像素亮度,从而 在滤波后达到想要的浮雕效果。 要注意的是最后在 imshow 函数中,要采用传递第二个参数[]的方式 把灰度值压缩到 0~255 中的方来自百度文库,来让最后的图像正常的显示。
首先来说最关键的函数 filter2。Filter2(a,b)中,a 为滤波用矩阵, b 为原先的矩阵。其基本运算方法和上次报告中的 filter 类似,不同 的是滤波矩阵以左上角元素与一个个像素重合,依次移动,其相关值 的计算结果,就是这个像素经过滤波后的值。这样来看这个方向滤波 算子的形式就很好理解了,正数部分就是加强的方向,也就是浮雕中
首先提出油画效果需要的两个参数,一个是半径 r ,一个是强度 intensity。r 就是进行处理的半径,r 越大色块的半径越大,其相邻像 素的区别越小, 图像本身越模糊。 其次强度代表了图像的点状化程度, 强度越高,图中的色块越小,相邻像素的颜色区别就越大,边界也会 越不平直,不规则。如上 3 张效果图,第一张的参数半径为 3,强度 为 30;第二张的参数半径为 10,强度为 30;第三张的参数半径为 3, 强度为 60。
其次我们来说明基本的算法。首先根据 r 确定一个(2r+1)*(2r+1) 矩阵,其中间的像素就是需要输出的像素。我们来遍历每个矩阵区域 中 的 像 素 , 读 取 该 像 素 的 rgb 值 , 通 过 公 式 fix((( R + G + B )/3.0)*intensity/255)+1 算出当前像素的相对强度,可见其取值是 1~intensity+1。因此这里有 4 个数组,sumR,sumG,sumB,sum,其 都有 intensity+1 位,对应像素相对强度的等级个数。Sum 矩阵的第 x 位,记录了相对强度为 x 的像素的个数,相对应的 sumR 的第 x 位, 记录了相对强度为 x 的像素的 R 值之和,sumG,sumB 同理。算过所 有(2r+1)*(2r+1)个像素之后,通过排序选出像素个数最多的相 对等级,这些像素平均的 rgb 值就是输出像素的 rgb 值。对于每一个 像素都做如此运算,就可以得到油画的结果。 对于其中需要注意的问题有两点,一是边界处理,这里的算法由于不 论是补 0 还是循环或是镜像效果, 都对图像本身的像素输出会产生错 误影响,因此采用了忽略边界的算法,也就是如果矩阵边界超出图像 范围,则超出的部分不取像素,不参与运算。其次是运算公式 fix((( R + G + B )/3.0)*intensity/255)+1 中,出现了远超过 255 的值。而公式中 的数都为 uint8 格式,这样会导致数字无法表示,出现错误,因此这 里把图像色域转成了 16bit,采用了 uint16 格式的数字来进行计算, 保证不会因为格式产生误差,最后输出时再转换回来。
I=imread('timg.jpg');%读入图像 h=[0,-1,-4;1,0,-1;4,1,0];%45°方向算子 J=filter2(h,I);%调用滤波函数 i=[4,1,0;1,0,-1;0,-1,-4];%135°方向算子 B=filter2(i,I);%调用滤波函数 H=J+B; imshow(I),title('原图'); figure,imshow(H,[]),title('浮雕效果图');%在新窗口中显示效果图
45 度-135 度浮雕效果
70 度-160 度浮雕效果
这里取一张灰度图像来体现浮雕的效果。可以看出,浮雕效果的体现 其实就是在边界处产生光照或阴影的效果, 使得图像不同的颜色的色 块看起来呈现出不同程度的凸出或凹陷。 在 MATLAB 中需要采用图像 滤波的方法来实现这个效果。 45 度~135 度浮雕效果生成的代码如下:
光线照过来的方向,反之负数的方向就是浮雕中阴影的方向。这样, 该程序生成的效果就是把原图浮雕化后,光线分别从 45 度和 135 度 照射过来的效果。两个方向同时打光的效果可以让浮雕的效果更真 实,如果只打一个方向的光阴影和光线都会十分明显,但是使图像本 身就变得不真实了。 在此基础上,参考老师给的文献,很容易得出任意方向浮雕的实现代 码,此处以 70 度~160 度举例:
end [sum,sun]=sort(sum); finalR=sumR(sun(intensity+1))/sum(intensity+1); finalG=sumG(sun(intensity+1))/sum(intensity+1); finalB=sumB(sun(intensity+1))/sum(intensity+1); out(i,j,1)=finalR; out(i,j,2)=finalG; out(i,j,3)=finalB; for h=1:intensity+1 sumR(h)=0; sumG(h)=0; sumB(h)=0; sum(h)=0; end end end out1=uint8(out); imshow(out1);
原图
油画效果 1
油画效果 2
油画效果 3
如上所示,可以看出油画效果对比原图来看,细节不是那么突出了, 边界更加圆滑,图像更像是用一个个色块拼成的效果。其算法并不是 用普通的滤波器实现的,而是由更复杂的非线性算法实现的,下面通 过讲解代码的方式来进行算法的解释。代码如下:
I=imread('timg1.jpg'); I=uint16(I); out=I; [m,n,z]=size(I); r=3; intensity=20; for i=1:intensity+1 sumR(i)=0; sumG(i)=0; sumB(i)=0; sum(i)=0; end for i=1:m for j=1:n for k=i-r:i+r pet=0; for l=j-r:j+r if(k>0&&k<=m&&l>0&&l<=n) R=I(k,l,1); G=I(k,l,2); B=I(k,l,3); pIns=fix((( R + G + B )/3.0)*intensity/255)+1; sumR(pIns)=sumR(pIns)+R; sumG(pIns)=sumG(pIns)+G; sumB(pIns)=sumB(pIns)+B; sum(pIns)=sum(pIns)+1; end end
I=imread('timg.jpg');%读入图像 a=70; h=[-sin(a)-cos(a),-cos(a),sin(a)-cos(a);-sin(a),0,sin(a);-sin(a)+cos( a),cos(a),sin(a)+cos(a)];%a 方向算子 J=filter2(h,I);%调用滤波函数 a=a+90; h=[-sin(a)-cos(a),-cos(a),sin(a)-cos(a);-sin(a),0,sin(a);-sin(a)+cos( a),cos(a),sin(a)+cos(a)];%a+90°方向算子 B=filter2(h,I);%调用滤波函数 H=J+B; imshow(I),title('原图'); figure,imshow(H,[]),title('浮雕效果图');%在新窗口中显示效果图
原理图
如上,根据图中公式,很简单的就可以算出任意方向的浮雕对应的滤 波器。 经过试验也可以很容易看出, 其矩阵中的值会根据 a 值的不同, 运算出该加强哪个方向的像素亮度,减少哪个方向的像素亮度,从而 在滤波后达到想要的浮雕效果。 要注意的是最后在 imshow 函数中,要采用传递第二个参数[]的方式 把灰度值压缩到 0~255 中的方来自百度文库,来让最后的图像正常的显示。
首先来说最关键的函数 filter2。Filter2(a,b)中,a 为滤波用矩阵, b 为原先的矩阵。其基本运算方法和上次报告中的 filter 类似,不同 的是滤波矩阵以左上角元素与一个个像素重合,依次移动,其相关值 的计算结果,就是这个像素经过滤波后的值。这样来看这个方向滤波 算子的形式就很好理解了,正数部分就是加强的方向,也就是浮雕中
首先提出油画效果需要的两个参数,一个是半径 r ,一个是强度 intensity。r 就是进行处理的半径,r 越大色块的半径越大,其相邻像 素的区别越小, 图像本身越模糊。 其次强度代表了图像的点状化程度, 强度越高,图中的色块越小,相邻像素的颜色区别就越大,边界也会 越不平直,不规则。如上 3 张效果图,第一张的参数半径为 3,强度 为 30;第二张的参数半径为 10,强度为 30;第三张的参数半径为 3, 强度为 60。
其次我们来说明基本的算法。首先根据 r 确定一个(2r+1)*(2r+1) 矩阵,其中间的像素就是需要输出的像素。我们来遍历每个矩阵区域 中 的 像 素 , 读 取 该 像 素 的 rgb 值 , 通 过 公 式 fix((( R + G + B )/3.0)*intensity/255)+1 算出当前像素的相对强度,可见其取值是 1~intensity+1。因此这里有 4 个数组,sumR,sumG,sumB,sum,其 都有 intensity+1 位,对应像素相对强度的等级个数。Sum 矩阵的第 x 位,记录了相对强度为 x 的像素的个数,相对应的 sumR 的第 x 位, 记录了相对强度为 x 的像素的 R 值之和,sumG,sumB 同理。算过所 有(2r+1)*(2r+1)个像素之后,通过排序选出像素个数最多的相 对等级,这些像素平均的 rgb 值就是输出像素的 rgb 值。对于每一个 像素都做如此运算,就可以得到油画的结果。 对于其中需要注意的问题有两点,一是边界处理,这里的算法由于不 论是补 0 还是循环或是镜像效果, 都对图像本身的像素输出会产生错 误影响,因此采用了忽略边界的算法,也就是如果矩阵边界超出图像 范围,则超出的部分不取像素,不参与运算。其次是运算公式 fix((( R + G + B )/3.0)*intensity/255)+1 中,出现了远超过 255 的值。而公式中 的数都为 uint8 格式,这样会导致数字无法表示,出现错误,因此这 里把图像色域转成了 16bit,采用了 uint16 格式的数字来进行计算, 保证不会因为格式产生误差,最后输出时再转换回来。
I=imread('timg.jpg');%读入图像 h=[0,-1,-4;1,0,-1;4,1,0];%45°方向算子 J=filter2(h,I);%调用滤波函数 i=[4,1,0;1,0,-1;0,-1,-4];%135°方向算子 B=filter2(i,I);%调用滤波函数 H=J+B; imshow(I),title('原图'); figure,imshow(H,[]),title('浮雕效果图');%在新窗口中显示效果图