首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

OpenCV 實作漫畫濾鏡(連環畫效果)

     編輯:關於C++

效果展示

龍珠漫畫濾鏡效果

演算法步驟

  1. 非線性色彩變換:
    R = (|2G - B + R| * R) >> 8
    G = (|2B - G + R| * R) >> 8
    B = (|2B - G + R| * R) >> 8
    右移 8 位相當於除以 256,產生高對比度色彩扭曲。
  2. 灰度化:平均值法 Gray = (R + G + B) / 3。
  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 核心演算法。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved