数字图像处理——图像艺术化处理OpenCV实验四艺术化效果和风格化效果实验
⼀.实验⽬的
(1) 了解各种图像艺术化处理⽅法的原理。
(2) 掌握各种艺术化处理⽅法的实现过程。
⼆.实验内容和要求
编程实现三种以上艺术化处理⽅法,三类效果中每类⾄少实现两种。
三.实验主要仪器设备和材料
计算机, VS2019+openCV
四.实验原理与实验步骤
1.艺术化效果
(1)⿊⽩照⽚制作
我们通常说的⿊⽩照⽚并不是数字图像中的⼆值图,⽽是灰度图。由彩⾊图像转化为灰度图像的过程叫做灰度化处理。⼀般情况下彩⾊图像每个像素⽤3个字节表⽰,每个字节对应着R、G、B分量的亮度(红、绿、蓝),转换后的灰度图像的⼀个像素⽤⼀个字节表⽰该点的灰度值,它的值在0~255之间,数值越⼤,该点越⽩,即越亮,越⼩则越⿊。转换关系为:
其中Gray(i,j)为转换后的灰度图像在(i,j)点处的灰度值。
灰度图只能表现256种颜⾊,灰度化处理还有其他的⽅法,如:取3个分量的最⼤值、最⼩值、算术平均值等,⽬的都是使颜⾊的R、G、B 分量值相等。
//⿊⽩
Mat BlackAndWhite(Mat src){
Mat output(src.size(), CV_8UC1);
for(int i =0; i < ws; i++){
for(int j =0; j < ls; j++){
output.at<uchar>(i, j)=0.11* src.at<Vec3b>(i, j)[2]+0.59* src.at<Vec3b>(i, j)[1]+0.30* src.at<Vec3b>(i, j)[0];
}
}
return output;
}
(2)染⾊效果处理
染⾊效果在数字图像处理中⼜叫伪彩⾊处理,即把整幅图像染成⼀种给定的⾊调。⽅法是指定⼀种渲染颜⾊,然后⽤当前像素的灰度分别乘以指定颜⾊的R、G、B三分量,并将结果作为当前像素的最终颜⾊。
Mat AddColors(Mat src){
Mat output(src.size(), CV_8UC3);
for(int i =0; i < ws; i++){
for(int j =0; j < ls; j++){
output.at<Vec3b>(i, j)[0]= src.at<uchar>(i, j)*255/255;
output.at<Vec3b>(i, j)[1]= src.at<uchar>(i, j)*245/255;
output.at<Vec3b>(i, j)[2]= src.at<uchar>(i, j)*0/255;
}
}
return output;
}
(3)怀旧效果处理
怀旧效果⼀般⽤在⼀些相⽚处理上,使整张相⽚呈棕褐⾊,仿佛相⽚已保存很久,已经发黄。⽅法是对每个像素的RGB分量按照公式(4-2)赋值:
//怀旧
Mat OldStyle(Mat src){
Mat output(src.size(), CV_8UC3);
for(int i =0; i < ws; i++){
for(int j =0; j < ls; j++){
float R = src.at<Vec3b>(i, j)[2]*0.393+ src.at<Vec3b>(i, j)[1]*0.769+ src.at<Vec3b>(i, j)[0]*0.189;
float G = src.at<Vec3b>(i, j)[2]*0.349+ src.at<Vec3b>(i, j)[1]*0.686+ src.at<Vec3b>(i, j)[0]*0.168;
float B = src.at<Vec3b>(i, j)[2]*0.272+ src.at<Vec3b>(i, j)[1]*0.534+ src.at<Vec3b>(i, j)[0]*0.131;
//防⽌某个颜⾊分量的值溢出
R = R >255?255: R;
G = G >255?255: G;
B = B >255?255: B;
output.at<Vec3b>(i, j)[2]= R;//R
output.at<Vec3b>(i, j)[1]= G;//G
output.at<Vec3b>(i, j)[0]= B;//B
}
}
return output;
}
2. 风格化效果
(1)马赛克处理
马赛克效果,其原理是将图像从形式上划分为很多⼩块(5*5),在每块内的各个像素都取到相同的红、绿、蓝颜⾊值,如块内任意⼀像素的值。从⽽对某些细节进⾏模糊化处理,使图像具有马赛克效果。rectangle函数opencv
//
Mat Mosaic(Mat src,int rectangleLenth){
Mat output(src.size(), CV_8UC3);
//取中⼼的像素值
for(int i =0; i < ws; i += rectangleLenth){
for(int j =0; j < ls; j += rectangleLenth){
//对矩形区域内的每⼀个像素值进⾏遍历
for(int k = i; k < rectangleLenth + i && k < ws; k++){
for(int m = j; m < rectangleLenth + j && m < ls; m++){
//在这⾥进⾏颜⾊的修改
output.at<Vec3b>(k, m)[0]= src.at<Vec3b>(i + rectangleLenth /2, j + rectangleLenth /2)[0];
output.at<Vec3b>(k, m)[1]= src.at<Vec3b>(i + rectangleLenth /2, j + rectangleLenth /2)[1];
output.at<Vec3b>(k, m)[2]= src.at<Vec3b>(i + rectangleLenth /2, j + rectangleLenth /2)[2];
}
}
}
}
return output;
}
(2)浮雕处理
浮雕效果针对灰度图像处理,就是只将图像的变化部分突出出来,⽽相同灰度部分则被淡化,使图像出现纵深感,从⽽达到浮雕效果。将要处理的像素取值为与处于前⼀个相邻像素间的差值,这样灰度平淡区因差值⼏乎为零则变成⿊⾊,可以通过加上⼀个常量来增加⼀些亮度。
其中,G(i,j)为处理后图像的像素值,f(i,j)为原图像的像素值,f(i-1,j)为前⼀个相邻像素的值,常量通常取值为128。
//浮雕
Mat Enchase(Mat src,int con){
//针对灰度图像处理
Mat output(src.size(), CV_8UC1);
for(int i =1; i < ws; i++){
for(int j =1; j < ls; j++){
float temp;
temp = src.at<uchar>(i, j)- src.at<uchar>(i -1, j)+ con;
if(temp <0|| temp>255)
{
temp = src.at<uchar>(i, j);
}
output.at<uchar>(i, j)= temp;
}
}
return output;
}
(3)霓虹处理
霓虹效果⽤来描绘图像的轮廓,勾画颜⾊变化的边缘,产⽣轮廓发光的效果。先计算原图像当前像素f(i,j)的红、绿、蓝分量与其相同⾏
f(i+1,j)及相同列f(i,j+1)相邻像素的梯度,即差的平⽅和的平⽅根,然后将梯度值作为处理后像素g(i,j)的红、绿、蓝的3个分量。
上式中r1,g1,b1分别为原图像像素f(i,j)的红、绿、蓝分量值,r2,g2,b2分别为原图像同⾏相邻像素f(i+1,j)的红、绿、蓝分量
值,r3,g3,b3分别为原图像同列相邻像素f(i,j+1)的红、绿、蓝分量值,Red,Green,Blue为图像处理后的像素f(i,j)的红、绿、蓝分量值。
//霓虹
Mat Neon(Mat src,int con){
//针对灰度图像处理
Mat output(src.size(), CV_8UC3);
for(int i =1; i < ws -1; i++){
for(int j =1; j < ls -1; j++){
int r1, r2, r3, g1, g2, g3, b1, b2, b3;
r1 = src.at<Vec3b>(i, j)[2];
r2 = src.at<Vec3b>(i +1, j)[2];
r3 = src.at<Vec3b>(i, j +1)[2];
g1 = src.at<Vec3b>(i, j)[1];
g2 = src.at<Vec3b>(i +1, j)[1];
g3 = src.at<Vec3b>(i, j +1)[1];
b1 = src.at<Vec3b>(i, j)[0];
b2 = src.at<Vec3b>(i, j +1)[0];
b3 = src.at<Vec3b>(i, j +1)[0];
double R1, R2, G1, G2, B1, B2;
R1 =pow(r1 - r2,2);
R2 =pow(r1 - r3,2);
G1 =pow(g1 - g2,2);
G2 =pow(g1 - g3,2);
B1 =pow(b1 - b2,2);
B2 =pow(b1 - b3,2);
double Red, Green, Blue;
Red =2*sqrt(R1 + R2);
Green =2*sqrt(G1 + G2);
Blue =2*sqrt(B1 + B2);
Red = Red >255?255: Red;
Green = Green >255?255: Green;
Blue = Blue >255?255: Blue;
Red = Red <0?0: Red;
Green = Green <0?0: Green;
Blue = Blue <0?0: Blue;
output.at<Vec3b>(i, j)[2]=(int)Red;
output.at<Vec3b>(i, j)[1]=(int)Green;
output.at<Vec3b>(i, j)[0]=(int)Blue;
}
}
return output;
}
(4)素描效果处理
⽣成近似素描效果的图像有很多种⽅法,借助拉普拉斯算⼦⽣成素描图的⽅法较为简单。理想的素描图像要求轮廓清晰,线条柔和,且不能包含过多的杂点⼲扰。拉普拉斯边缘检测得到的正边缘通常可以较好地描述图形的轮廓线条,但往往包含过多的细节信息或受杂点影响,因此需要对边缘检测结果进⾏进⼀步处理。⾸先使⽤卷积模板消除⼤量杂点,然后通过设定阈值消除剩余的少量灰度较低的斑点,最后对得到的素描图进⾏模糊处理,依然使⽤卷积模板。
实现步骤:
(1)读取图像⽂件。
(2)对图像利⽤拉普拉斯算⼦进⾏边缘检测,采⽤卷积模板的⽅法。模板如图(a)所⽰。
(3)去除杂点,同样使⽤卷积模板的⽅法。对每个像素分别使⽤两个模板(如图(b)所⽰)进⾏卷积运算,对两个结果取较⼤值,与阈值(⼀般设为25)⽐较,⼩于阈值的点即为杂点。
(4)去除杂点后,图像仍然含有少量灰度较低的斑点,通过设定灰度阈值Ka(⼀般设为32)去除。⽅法为:对每个像素的灰度值乘以2,如果灰度值⼤于255,则设为255;如果⼩于阈值Ka,则设为0。
(5)对素描图进⾏模糊处理,卷积模板如图©所⽰。
(6)对图像取反操作,显⽰处理后的图像。
3. 扭曲效果处理
扭曲效果包括挤压效果、球⾯效果、漩涡效果、波浪效果和摩尔纹效果。这些效果需要的参数都差不多,主要是新的x,y的坐标计算不太⼀样。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论