一、浮雕效果
【原理:】每个像素的RGB值都设置为该位置的初始值减去其右下方第二的像素的差,最后统一加上128用于控制灰度,显示出类似浮雕的灰色。这样处理的思路是,将图像上的每个点与它的对角线的像素点形成差值,这样淡化相似的颜色,突出不同的颜色、边缘,从而使图像产生纵深感,产生类似于浮雕的效果。我采用的是循环减去每个像素后面第五个值,效果看起来还不错。
【代码:】
void embossEffect(Mat &img)
{
cv::Mat_<cv::Vec3b>::iterator it = img.begin<cv::Vec3b>();
cv::Mat_<cv::Vec3b>::iterator itend = img.end<cv::Vec3b>();for (; it != itend-5; ++it)
{
(*it)[0] = saturate_cast<uchar>( (*it)[0] - (*(it + 5))[0]+128);
(*it)[1] = saturate_cast<uchar>((*it)[1] - (*(it + 5))[1]+128);
(*it)[2] = saturate_cast<uchar>((*it)[2] - (*(it + 5))[2]+128);
}
}
【效果图:】
二、简单倒影效果
【原理:】1.获得一个倒立的镜面图像,即将原图像反转2.对镜面图像进行模糊化来模拟水中倒影的样子。这里的模糊是采用让每个像素点在原来的位置周围随机振荡的方式实现的。具体来看,我采用了生成了一个随机变量deltax作为像素”跳跃”的坐标变化——即将(i,j)+deltax处的值复制到img(I,j)处。这个像素”跳跃“的范围在半径为20的圆内。3.图像拼接。拼接原图与水面倒影图,并柔和拼接边界。之所以柔和边界,主要是直接拼接时两张图会出现明显的分界线。柔和边界做法比较简单,主要是在边界区域做一次渐变模糊,这样从原图到倒影图的过渡就会非常自然。(柔和边界这次没做,有时间了补上)
【代码:】
Mat reflection(Mat img)
{
Mat dstImg = Mat(2*img.rows,img.cols,img.type());
img.copyTo(Mat(dstImg, Rect(0, 0, img.cols, img.rows)));
srand((int)time(NULL));
cv::Mat_<cv::Vec3b>::iterator it = img.begin<cv::Vec3b>();
cv::Mat_<cv::Vec3b>::iterator itend = img.end<cv::Vec3b>();
for (; it != itend ; ++it)
{
int deltax = rand() % 25;
while(it + deltax > itend)
{
deltax = rand() % 25;
}
(*it)[0] = saturate_cast<uchar>((*(it + deltax))[0]);
(*it)[1] = saturate_cast<uchar>((*(it + deltax))[1]);
(*it)[2] = saturate_cast<uchar>((*(it + deltax))[2]);
}
flip(img, img, 0);
img.copyTo(Mat(dstImg, Rect(0, img.rows, img.cols, img.rows)));
return dstImg;
}
【效果:】
【总结:】本次只是简单实现下效果原理,真正要达到ps那种效果,需要优化的地方还很多。