openCV學習記錄 濾鏡 碎片 暗調

2021-07-09 18:53:24 字數 2416 閱讀 7088

碎片濾鏡

photoshop軟體有乙個碎片濾鏡。我在實現碎片濾鏡的過程中,發現只要改幾個數就可以實現影象重影的效果。

將影象建立四個相互偏移的副本,疊加之後產生類似重影的效果。偏移方向為左上,左下,右上,右下,偏移角度為45度。將四個方向的偏移量累加求平均值作為中心點畫素的值。各個方向的偏移量可以相同也可以不同。先來看相同的情況。

假如四個方向都偏移4個畫素大小:

完整**如下:

#include

#include

using

namespace cv;

using

namespace

std;

void chongyingfilter(mat &srcimage);

int main()

imshow("原圖",srcimage);

chongyingfilter(srcimage);

waitkey(0);

return0;}

void chongyingfilter(mat &srcimage);

int offseti[4] = ;

int sumb,sumg,sumr;

for(int j = 0;jfor(int i = 0;i0;sumg = 0;sumr = 0;

for(int k = 0;k<4;k++)else

if(jj >= srcimage.rows)

if(ii < 0)else

if(ii >= srcimage.cols)

//累加,求當前畫素點的左下,左上,右上,右下四個偏移量的和

sumb += srcimage.at(jj,ii)[0];

sumg += srcimage.at(jj,ii)[1];

sumr += srcimage.at(jj,ii)[2];

}//求平均值,求平均值(sum+2)/4,

//為什麼要+2,就為了四捨五入。比如如果計算結果為108.6,則取畫素109更為合理

srcimage.at(j,i)[2] = (sumr+2)>>2;

srcimage.at(j,i)[1] = (sumg+2)>>2;

srcimage.at(j,i)[0] = (sumb+2)>>2;}}

imshow("重影濾鏡",srcimage);

}

如果把偏移量調大呢?比如每個方向都是16個畫素大小

int offsetj[4] = ;

int offseti[4] = ;

效果圖如下:

如果只把乙個方向的偏移量調大,其餘三個一樣大呢:

int offsetj[4] = ;

int offseti[4] = ;

這事產生重影,效果圖如下:

如果想重影是上下方向呢?就像下圖那樣:

那就這樣調偏移量:

int offsetj[4] = ;

int offseti[4] = ;

總結:還有其他變化嗎?

當然,比如右下方向的偏移量比其他三個都要大,又會產生新的重影影象,亦或者把偏移數目調成8個,再增加上下左右四個偏移量,產生的影象又會是什麼樣呢???有興趣的讀者可以嘗試一下,我這裡就不一一枚舉了。

暗調濾鏡

原理如下:

#include

#include

using

namespace cv;

using

namespace

std;

void andiaofilter(mat &srcimage);

int main()

imshow("原圖",srcimage);

andiaofilter(srcimage);

waitkey(0);

return0;}

void andiaofilter(mat &srcimage)

}imshow("暗調濾鏡",srcimage);

}

效果圖如下:

openCV學習記錄 濾鏡 交叉沖印

交叉沖印濾鏡 交叉沖印還有乙個名字叫正片負衝,經過該濾鏡修飾的 亮部變黃,暗部變藍,色彩更加艷麗。來一張lena女神的效果圖 再來一張風景效果圖 完整版 如下 include include using namespace cv using namespace std void punchfilte...

學習opencv記錄 三)

include include highgui.h include cv.h 這種訪問操作比cvget系列函式更快,因為不需要入棧出棧,只是通過指標偏移來進行的 int main int argc,char argv cvmat mat cvinitmatheader mat,3,6,cv 32fc...

OpenCV學習記錄5

一 學習內容 1 兩張影象按權重相加 2 兩張影象相乘 應該可用於頻域濾波吧 二 include include using namespace std using namespace cv int main int argc,char ar if src2.data namedwindow fig...