专栏地址: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-机器视觉 微博:林建民-机器视觉