gray = max(R,G,B)(亮度高)gray = (R+G+B)/3(柔和)gray = 0.30R + 0.59G + 0.11B(最符合人眼,推薦)gray = (gray > 127) ? 255 : 0,產生黑白木刻風格。cvtColor(src, dst, CV_BGR2GRAY):彩色轉灰度(單通道)。threshold(src, dst, 127, 255, THRESH_BINARY):二值化,type 可選 5 種模式(二值、反二值、截斷、歸零、反歸零)。void woodcutFilter(Mat& src) {
int rows = src.rows, cols = src.cols;
for (int y = 0; y < rows; ++y) {
uchar* data = src.ptr(y);
for (int x = 0; x < cols; ++x) {
int b = data[x*3], g = data[x*3+1], r = data[x*3+2];
int gray = (int)(0.30*r + 0.59*g + 0.11*b); // 加權灰度
uchar val = (gray > 127) ? 255 : 0;
data[x*3] = data[x*3+1] = data[x*3+2] = val;
}
}
}
R' = 0.393R + 0.769G + 0.189B G' = 0.349R + 0.686G + 0.168B B' = 0.272R + 0.534G + 0.131B
模擬老照片發黃褪色效果,結果限制在 [0,255]。
void nostalgicFilter(Mat& src) {
int rows = src.rows, cols = src.cols;
for (int y = 0; y < rows; ++y) {
uchar* data = src.ptr(y);
for (int x = 0; x < cols; ++x) {
int b = data[x*3], g = data[x*3+1], r = data[x*3+2];
int R = cvRound(0.393*r + 0.769*g + 0.189*b);
int G = cvRound(0.349*r + 0.686*g + 0.168*b);
int B = cvRound(0.272*r + 0.534*g + 0.131*b);
data[x*3] = saturate_cast(B);
data[x*3+1] = saturate_cast(G);
data[x*3+2] = saturate_cast(R);
}
}
}

| 濾鏡 | 核心操作 | OpenCV 關鍵函數 |
|---|---|---|
| 木刻 | 灰度化 + 二值化 | cvtColor, threshold |
| 懷舊 | 3×3 色彩矩陣變換 | 手動像素運算或 transform |
兩種濾鏡均為像素級獨立運算,易於並行化(CUDA/OpenCL)加速。