程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> openCV學習記錄:濾鏡:木刻&懷舊

openCV學習記錄:濾鏡:木刻&懷舊

編輯:關於C++

木刻濾鏡

木刻濾鏡其實就是圖像的二值化處理。圖像的二值化處理就是將每個像素點的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: 設定值的方法,有五種,如下圖

type

所以這個濾鏡用最簡單的方法寫的話,代碼很少,如下:<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwcmUgY2xhc3M9"brush:java;"> #include #include using namespace cv; using namespace std; void muKeFilter(Mat &srcImage); int main(){ Mat srcImage = imread("lena.jpg"); if(!srcImage.data || srcImage.empty()){ cout<<"讀入圖片錯誤!"<

效果圖:
這裡寫圖片描述

懷舊濾鏡

懷舊濾鏡就是讓照片有種發黃的效果。主要算法思想:

按以下公式計算新的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);
}

效果圖:

懷舊

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved