vignette濾鏡效果:把圖像邊緣像素變暗,中心元素變得明亮。
首先看看效果,原圖如下:
濾鏡處理後的效果:
實現思路:
變暗——對彩色圖像而言,對每個像素的三個通道即RGB分別減去一個相同的值v(保證變化後的像素值在0~255之間)。
v值的確定——p*當前像素點point距離中點的距離的平方/圖像四個頂點到中點的距離的平方。(p的值可控制)
關鍵代碼(項目中一部分,只用領會其思路即可)如下:
void qt_test::slotProcessImage(int num)
{
cvCopy(this->image,this->imageCopy,NULL);
float value = 0.5;
cv::Mat imageMat(this->imageCopy,0);
int width = imageMat.cols;
int height = imageMat.rows;
int centerX = width>>1;
int centerY = height>>1;
int maxDis = centerX*centerX+centerY*centerY;
float diff = maxDis*value;
float ratio = width>height?height/width:width/height;
for(int i =0;i<height;i++)
{
uchar *imageRow = imageMat.ptr<uchar>(i);
for(int j=0;j<width;j++)
{
int b = imageRow[3*j];
int g = imageRow[3*j+1];
int r = imageRow[3*j+2];
float dx = j-centerX;
float dy = i-centerY;
if(width>height)
{
dx = dx*ratio;
}
else
{
dy = dy*ratio;
}
float dis = dx*dx+dy*dy;
float v = num*dis/diff;
b = (int)(b-v);
g = (int)(g-v);
r = (int)(r-v);
b = (b>255?255:(b<0?0:b));
g = (g>255?255:(g<0?0:g));
r = (r>255?255:(r<0?0:r));
this->imageCopy->imageData[this->image->widthStep*i+3*j]=(uchar)b;
this->imageCopy->imageData[this->image->widthStep*i+3*j+1]=(uchar)g;
this->imageCopy->imageData[this->image->widthStep*i+3*j+2]=(uchar)r;
}
}
if(this->isImageLoaded)
{
this->loatPicture(this->width(),this->height(),this->imageCopy);
}
}