霓虹效果
霓虹效果用来描绘图像的轮廓,勾画颜色变化的边缘,产生轮廓发光的效果。先计算原图像当前像素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 < src.rows - 1; i++) {
for (int j = 1; j < src.cols - 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;
}