木刻濾鏡
木刻濾鏡其實就是圖像的二值化處理。圖像的二值化處理就是將每個像素點的RGB分量值設成0或255。進行圖像二值化之前,先將圖像做灰度化處理,灰度化就是把每個像素點的RGB分量值設成一樣大。圖像的灰度化處理有三種方法:最大值法,平均法或權值法。
最大值法:顧名思義就是取RGB三個分量的最大值作為灰度值,即:gray=max(R,G,B),這種方法轉化的灰度圖亮度很高。
平均值法:就是取RGB三個分量的平均值作為灰度值,即:gray=(R+G+B)/ 3。這種方法產生的灰度圖比較柔和。
權值法:對RGB三個分量按不同的比率取值的和作為灰度值。由於人眼對綠色最為敏感,紅色次之,對藍色的敏感性最低,因此將得到較易識別的灰度圖像。一般得到的灰度圖像效果最好。公式如下:
Gray = 0.30R + 0.59G + 0.11B 。
二值化就是在灰度圖像的基礎上,所有灰度值大於或等於閥值的像素被判定為屬於特定物體,其灰度值為255表示,否則這些像素點被排除在物體區域以外,灰度值為0,表示背景或者例外的物體區域。公式如下:
gray = gray > 閥值 ? 255 : 0。為了實現木刻濾鏡,閥值設成127.
openCV有專門的圖像灰度化處理函數:cvtColor()
void cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0 )
參數說明:
src:輸入圖像 dst:輸出圖像 code:顏色空間轉換碼,這個值決定轉換模式,要想將彩色圖像轉成灰度圖像,這個值設成:CV_BGR2GRAY dstCn:一般為0這個函數可以將圖像在RGB,HSV ,HLS,Gray等多種模式間互相轉換,第三個參數決定以哪種模式轉換。
用該函數對彩色圖像灰度化以後,圖像會由三通道變成一通道。
完整版代碼如下:
void muKeFilter(Mat &srcImage){
Mat dstImage = srcImage;
cvtColor(dstImage,dstImage,CV_BGR2GRAY);
int rowNum = dstImage.rows;//要處理的行數
int colNum = dstImage.cols ;//要處理的列數
for(int j = 0;j(j);
for(int i = 0;i 127 ? 255:0;
}
}
}
如果不用cvtColor()函數對彩色圖像做灰度化預處理,直接用自己的代碼對圖像灰度化處理,像下面的代碼:
int rowNum = srcImage.rows;//要處理的行數
int colNum = srcImage.cols ;//要處理的列數
for(int j = 0;j(j);
for(int i = 0;i 127 ? 255:0;//二值化
row[i*3] = gray;
row[i*3+1] = gray;
row[i*3+2] = gray;
}
}
這時候,圖像還是三通道的。
openCV裡有一個專門的二值化函數
double threshold(InputArray src, OutputArray dst, double thresh, double maxval, int type)
參數說明:
src: 輸入圖像,必須是單通道的 dst: 輸出圖像 thresh: 閥值 maxval: 最大值type: 設定值的方法,有五種,如下圖
所以這個濾鏡用最簡單的方法寫的話,代碼很少,如下:<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwcmUgY2xhc3M9"brush:java;">
#include
效果圖:
懷舊濾鏡
懷舊濾鏡就是讓照片有種發黃的效果。主要算法思想:
按以下公式計算新的RGB值:
int R = 0.393*r + 0.769*g + 0.189*b;
int G = 0.349*r + 0.686*g + 0.168*b;
int B = 0.272*r + 0.534*g + 0.131*b;
RGB的值要約束在0與255之間。
主要代碼如下:
#include
#include
using namespace cv;
using namespace std;
void huaiJiuFilter(Mat &srcImage);
int main(){
Mat srcImage = imread("lena.jpg");
if(!srcImage.data || srcImage.empty()){
cout<<"讀入圖片錯誤!"<(j);
for(int i = 0;i(0.393*r + 0.769*g + 0.189*b);
int G = static_cast(0.349*r + 0.686*g + 0.168*b);
int B = static_cast(0.272*r + 0.534*g + 0.131*b);
data[i*3+2] = max(0,min(R,255));
data[i*3+1] = max(0,min(G,255));
data[i*3] = max(0,min(B,255));
}
}
imshow("懷舊濾鏡",srcImage);
}
效果圖: