效果展示

演算法步驟
- 非線性色彩變換:
R = (|2G - B + R| * R) >> 8
G = (|2B - G + R| * R) >> 8
B = (|2B - G + R| * R) >> 8
右移 8 位相當於除以 256,產生高對比度色彩扭曲。
- 灰度化:平均值法
Gray = (R + G + B) / 3。
- 偽彩色著色:
R = Gray + 10
G = Gray + 10
B = Gray
產生微黃/棕調的懷舊漫畫質感。所有通道值限制在 [0, 255]。
完整代碼
#include
#include
using namespace cv;
using namespace std;
void comicFilter(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];
int g = data[x*3+1];
int r = data[x*3+2];
// 步驟 1:非線性變換
int R = (abs(2*g - b + r) * r) >> 8;
int G = (abs(2*b - g + r) * r) >> 8;
int B = (abs(2*b - g + r) * r) >> 8;
R = max(0, min(R, 255));
G = max(0, min(G, 255));
B = max(0, min(B, 255));
// 步驟 2:灰度
int gray = (R + G + B) / 3;
// 步驟 3:著色
R = min(255, gray + 10);
G = R;
B = gray;
data[x*3] = B;
data[x*3+1] = G;
data[x*3+2] = R;
}
}
}
int main() {
Mat img = imread("longzhu.jpg");
if (img.empty()) { cerr << "讀取失敗\n"; return -1; }
comicFilter(img);
imshow("連環畫濾鏡", img);
waitKey(0);
return 0;
}
應用場景
- 照片漫畫化、懷舊風格化、藝術濾鏡 App 核心演算法。