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

OpenCV 實作木刻與懷舊濾鏡:二值化與色調模擬

     編輯:關於C++

一、木刻濾鏡(二值化)

原理

  1. 灰度化:三種方法
    • 最大值法:gray = max(R,G,B)(亮度高)
    • 平均值法:gray = (R+G+B)/3(柔和)
    • 加權法:gray = 0.30R + 0.59G + 0.11B(最符合人眼,推薦)
  2. 二值化:閾值分割 gray = (gray > 127) ? 255 : 0,產生黑白木刻風格。

OpenCV 內建函數

  • 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)加速。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved