专栏地址:http://blog.csdn.net/column/details/imagep.html
本篇文章主要记录一下图像处理软件中的图像特效(浮雕、怀旧)的实现过程。
图像浮雕效果
浮雕的算法就是对图像中的每一个点做卷积处理,采用的掩模矩阵如下所示:
[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之间。
Ref:学习OpenCV:滤镜系列(1)—— 雕刻&浮雕(小熊不去实验室)
Code:
void MainWindow::on_actionRelief_triggered() { cv::Mat img0(image.size(),CV_8UC3); //cv::Mat img1(image.size(),CV_8UC3); for(int y = 1; y < image.rows-1; y++) { uchar *p0 = image.ptr<uchar>(y); uchar *p1 = image.ptr<uchar>(y+1); uchar *q0 = img0.ptr<uchar>(y); for(int x = 1; x < image.cols-1; x++) { for(int i=0;i<3;i++) { int tmp0 = p1[3*(x+1)+i]-p0[3*(x-1)+i]+128; if(tmp0 < 0) q0[3*x+i]=0; else if(tmp0>255) q0[3*x+i]=255; else q0[3*x+i]=tmp0; } } } cv::imwrite("./img0.jpg",img0); ui->textBrowser->clear(); ui->textBrowser->append("<img src= ./img0.jpg>"); }
图像怀旧效果
图像的怀旧效果主要是对RGB的值进行调整,公式如下:
Code:
void MainWindow::on_actionOld_triggered() { cv::Mat oldImage(image.size(),CV_8UC3); for(int y = 0; y < image.rows; y++) { uchar* P0 = image.ptr<uchar>(y); uchar* P1 = oldImage.ptr<uchar>(y); for(int x = 0; x < image.cols; x++) { float B = P0[3*x]; float G = P0[3*x+1]; float R = P0[3*x+2]; float newB = 0.272*R + 0.534*G + 0.131*B; float newG = 0.349*R + 0.686*G + 0.168*B; float newR = 0.393*R + 0.769*G + 0.189*B; if(newB < 0 ) newB = 0; if(newB > 255) newB = 255; if(newG < 0 ) newG = 0; if(newG > 255) newG = 255; if(newR < 0 ) newR = 0; if(newR > 255) newR = 255; P1[3*x] = (uchar)newB; P1[3*x+1] = (uchar)newG; P1[3*x+2] = (uchar)newR; } } cv::imwrite("./old.jpg",oldImage); ui->textBrowser->clear(); ui->textBrowser->append("<img src= ./old.jpg>"); }
更多图像处理、机器视觉资料,请关注博客:LinJM-机器视觉 微博:林建民-机器视觉
图像处理软件开发记录(六) 图像特效(浮雕、怀旧),布布扣,bubuko.com
原文:http://blog.csdn.net/linj_m/article/details/22720103