vignette濾鏡效果

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);
    }
}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章