实验的目的是按照PhotoShop中实现滤镜效果的步骤进行matlab程序编码,最后实现相应的滤镜效果。主要包含的滤镜效果有:浮雕效果、怀旧色风格、连环画效果、交叉冲印效果、光照效果、扩散(毛玻璃)效果、羽化效果、素描效果、强光效果等。
1.浮雕效果
浮雕的算法是对图像的每一个点进行卷积处理,采用的矩阵如下:
[1 0 0; 0 0 0; 0 0 -1];
假设原图像为X,处理后的图像为Y。对于坐标为(i,j)点,其浮雕效果图的算法为Y(i,j)=X(i+1,j+1)-X(i-1,j-1)+128;X,Y的取值均在0~255之间。
2.怀旧色效果
怀旧风格滤镜是一种使图像颜色发黄的颜色风格。该滤镜模拟久置的相片发生褪色老化的效果。怀旧风格滤镜算法可以用一种点运算来表示,R、G、B分量的点运算映射函数分别如下所示:
R = 0.393r+0.769g+0.189b (2-1)
G = 0.349r+0.686g+0.168b (2-2)
B = 0.272r+0.534g+0.131b (2-3)
3.连环画效果
连环画调色原理:连环画的效果与图像灰度化后的效果相似,它们都是灰度图,但连环画增大了图像的对比度,使整体明暗效果更强。算法如下:
R = |g-b+g+r| × r/256; (2-4)
G = |b-g+b+r| × r/256; (2-5)
B = |b-g+b+r| × g/256; (2-6)
4.交叉冲印效果
交叉冲印还有一个名字叫正片负冲,经过该滤镜修饰的照片亮部变黄,暗部变蓝,色彩更加艳丽。交叉冲印滤镜的算法 可以用一种点运算来表示,R、G、B分量的点运算映射函数如下所示。
5.光照效果
光照效果滤镜的实际原理为:光照强度按照像素点与光源的距离长度增加而逐渐衰减,当距离超过光照半径后光照强度为0,整幅图像的像素值修改为光照强度值加上原始值。根据该原理,设计该滤镜算法以下述方式进行滤波,式中X和Y表示光源的坐标,x和y表示待处理像素的坐标值,K表示光照强度系数,R表示光照半径,I表示像素值。
6.扩散(毛玻璃)效果
PhotoShop里的扩散,就相当于毛玻璃的感觉。扩散原理:用当前点四周一定范围内任意一点的颜色来替代当前点颜色,最常用的是随机的采用相邻点进行替代。
7.羽化效果
在PhotoShop里,羽化就是使你选定范围的图边缘达到朦胧的效果。羽化值越大,朦胧范围越宽,羽化值越小,朦胧范围越窄。可根据你想留下图的大小来调节。算法如下:
1.通过对rgb值增加额外的V值实现朦胧效果;
2.通过控制V值的大小实现范围控制;
3.V = 255 × (当前点Point距中点距离的平方)s1 / (顶点距中点的距离平方 × mSize)s2;
8.素描效果
PhotoShop里面把彩色图片打造成素描的效果仅仅需要几步操作:
1.去色(转为灰度图);
2.复制去色图层,并且反色(反色相当于Y(i,j) = 255 - X(i,j));
3.对反色图像进行高斯模糊;
4.模糊后的图像叠加模式选择颜色减淡效果。减淡公式:C = MIN( A +(A×B)/(255-B, 255),其中C为混合结果,A为去色后的像素点,B为高斯模糊后的像素点。
9.强光效果
强光模式提高和降低图像亮度的规律以中性灰为中间点(灰度是127.5),大于127.5(比中性灰亮)时,提高背景图的亮度,小于127.5(比中性灰暗)时,降低背景图的亮度。
1.R>127.5时 R = R + (255 - R) × (R - 127.5) / 127.5; (2-12)
2.R<127.5时 R = R - R × (127.5 - R) / 127.5 = (R × R) / 127.5。 (2-13)
%实现图像浮雕效果
for k=1:d % d--通道数
for i=2:m-1 % m--行数
for j=2:n-1 % n--列数
img2(i,j,k) = img(i+1,j+1,k)-img(i-1,j-1,k)+128;%浮雕效果算法
if img2(i,j,k)>255
img2(i,j,k) = 255; %像素值超过255的都置为255
elseif img2(i,j,k)<0
img2(i,j,k) = 0; %像素值小于0的都置为0
else
img2(i,j,k) = img2(i,j,k);
end
end
end
end
%怀旧色效果
for i=1:m
for j=1:n
img3(i,j,1) = 0.393*img(i,j,1)+0.769*img(i,j,2)+0.189*img(i,j,3);
img3(i,j,2) = 0.349*img(i,j,1)+0.686*img(i,j,2)+0.168*img(i,j,3);
img3(i,j,3) = 0.272*img(i,j,1)+0.534*img(i,j,2)+0.131*img(i,j,3);
end
end
%连环画效果
for i=1:m
for j=1:n
img4(i,j,1) = uint8(abs(uint16(img(i,j,2))-uint16(img(i,j,3))+uint16(img(i,j,2))+uint16(img(i,j,1))) * uint16(img(i,j,1)) / 256);
img4(i,j,2) = uint8(abs(uint16(img(i,j,3))-uint16(img(i,j,2))+uint16(img(i,j,3))+uint16(img(i,j,1))) * uint16(img(i,j,1)) / 256);
img4(i,j,3) = uint8(abs(uint16(img(i,j,3))-uint16(img(i,j,2))+uint16(img(i,j,3))+uint16(img(i,j,1))) * uint16(img(i,j,2)) / 256);
end
end
img4 = rgb2gray(img4);%转为灰度图
%交叉冲印效果
for i=1:m
for j=1:n
if img(i,j,1)<128
img5(i,j,1) = uint8(uint16(img(i,j,1)) * uint16(img(i,j,1)) * uint16(img(i,j,1))/ 16384);
else
img5(i,j,1) = uint8(256 - (256 - uint16(img(i,j,1))) * (256 - uint16(img(i,j,1))) * (256 - uint16(img(i,j,1))) / 16384);
end
if img(i,j,2)<128
img5(i,j,2) = uint8(uint16(img(i,j,2)) * uint16(img(i,j,2)) / 128);
else
img5(i,j,2) = uint8(256 - (256 - uint16(img(i,j,2))) * (256 - uint16(img(i,j,2))) / 128);
end
img5(i,j,3) = uint8(uint16(img(i,j,3)) / 2 + 37);
end
end
%光照效果
K = 100;%光照强度系数
R = 100;%光照半径
X = n/2;%光源坐标
Y = m/2;
for i=1:m
for j=1:n
distance = sqrt((i-Y)*(i-Y) + (j-X)*(j-X));
img6(i,j,1) = uint8(uint16(img(i,j,1)) + K * max(0,1-distance/R));
img6(i,j,2) = uint8(uint16(img(i,j,2)) + K * max(0,1-distance/R));
img6(i,j,3) = uint8(uint16(img(i,j,3)) + K * max(0,1-distance/R));
end
end
%扩散(毛玻璃)效果
img8 = img;
for i=2:m-1
for j=2:n-1
tmp = randi([0,9]);
img7(i,j,1) = img(i-1+rem(tmp,3),j-1+mod(tmp,3),1);
img7(i,j,2) = img(i-1+rem(tmp,3),j-1+mod(tmp,3),2);
img7(i,j,3) = img(i-1+rem(tmp,3),j-1+mod(tmp,3),3);
end
end
%羽化(模糊边缘)效果
mSize = 0.6;
centerX = n/2;
centerY = m/2;
diff = (centerX*centerX + centerY*centerY) * mSize;
if n>m
ratio = m/n;
else
ratio = n/m;
end
for i=1:m
for j=1:n
dx = centerX - j;
dy = centerY - i;
if n>m
dx = dx * ratio;
else
dy = dy * ratio;
end
dstSq = dx * dx + dy * dy;
V = 255 * dstSq / diff;
img8(i,j,1) = img(i,j,1) + V;
img8(i,j,2) = img(i,j,2) + V;
img8(i,j,3) = img(i,j,3) + V;
end
end
%素描效果
img9_gray0= rgb2gray(img);%转为灰度图
img9_gray1 = 255 - img9_gray0;%反色
w = fspecial('gaussian',[5 5],5);%构造一个高斯滤波器
img9_gray2 = imfilter(img9_gray1,w);%高斯模糊
%模糊后的图像叠加模式选择颜色减淡效果。
for i=1:m
for j=1:n
img9(i,j) = uint8(min(uint16(img9_gray0(i,j)) + (uint16(img9_gray0(i,j))*uint16(img9_gray2(i,j))) / (255 - uint16(img9_gray2(i,j))),255));
end
end
%强光效果
for i=1:m
for j=1:n
if img(i,j,1)>127.5
img10(i,j,1) = uint8(uint16(img(i,j,1)) + (255 - uint16(img(i,j,1))) * (uint16(img(i,j,1))-127.5) / 127.5);
else
img10(i,j,1) = uint8(uint16(img(i,j,1)) * uint16(img(i,j,1)) / 127.5);
end
if img(i,j,2)>127.5
img10(i,j,2) = uint8(uint16(img(i,j,2)) + (255 - uint16(img(i,j,2))) * (uint16(img(i,j,2))-127.5) / 127.5);
else
img10(i,j,2) = uint8(uint16(img(i,j,2)) * uint16(img(i,j,2)) / 127.5);
end
if img(i,j,3)>127.5
img10(i,j,3) = uint8(uint16(img(i,j,3)) + (255 - uint16(img(i,j,3))) * (uint16(img(i,j,3))-127.5) / 127.5);
else
img10(i,j,3) = uint8(uint16(img(i,j,3)) * uint16(img(i,j,3)) / 127.5);
end
end
end