1. 程式人生 > 實用技巧 >OpenCV實現Photoshop演算法(六): 變為黑白影象

OpenCV實現Photoshop演算法(六): 變為黑白影象

變為黑白影象

將彩色圖片變成黑白灰度影象的演算法,一般是:Gray = Red * 0.299 + Green * 0.587 + Blue * 0.114

Photoshop提供了一個高階的黑白影象調整功能,可獲得更好的黑白影象效果。 Photoshop設定了red, yellow, green, cyan, blue, magenta 六個顏色的灰度係數(係數的取值範圍是 -1 到 1), 這六個係數的初始值是: red=0.4, yellow=0.6, green =0.4, magenta=0.6, blue=0.2, cyan=0.8 如果調大某顏色的係數值,則這種顏色將更白。反之更黑。 用OpenCV C++實現上述功能:
1,我編寫了一個BlackWhite類,原始碼檔案兩個:BlackWhite.hpp,BlackWhite.cpp 2,BlackWhite類包含六個色調的係數值,設定這些系統值,然後呼叫adjust()方法 實施灰度影象調整。 示範例程:
 1 #include <iostream>
 2 #include "opencv2/core.hpp"
 3 #include "opencv2/imgproc.hpp"
 4 #include "opencv2/highgui.hpp"
 5  
 6 #include "BlackWhite.hpp"
 7  
 8 using namespace
std; 9 using namespace cv; 10 11 12 #define BASE 200 13 14 static string window_name = "photo"; 15 static Mat src; 16 static int red = 40 + BASE; 17 static int yellow = 60 + BASE; 18 static int green = 40 + BASE; 19 static int magenta = 60 + BASE; 20 static int blue = 20 + BASE; 21 static int
cyan = 80 + BASE; 22 23 static void callbackAdjust(int , void *) 24 { 25 Mat dst; 26 BlackWhite b; 27 28 //set params 29 b.red = (red - BASE) / 100.0; 30 b.yellow = (yellow - BASE) / 100.0; 31 b.green = (green - BASE) / 100.0; 32 b.magenta = (magenta - BASE) / 100.0; 33 b.blue = (blue - BASE) / 100.0; 34 b.cyan = (cyan - BASE) / 100.0; 35 36 //adjust Black White 37 b.adjust(src, dst); 38 39 imshow(window_name, dst); 40 } 41 42 43 int main() 44 { 45 src = imread("girl.jpg"); 46 47 if ( !src.data ) { 48 cout << "error read image" << endl; 49 return -1; 50 } 51 52 namedWindow(window_name); 53 54 //create trackbars 55 createTrackbar("red", window_name, &red, 500, callbackAdjust); 56 createTrackbar("yellow", window_name, &yellow, 500, callbackAdjust); 57 createTrackbar("green", window_name, &green, 500, callbackAdjust); 58 createTrackbar("cyan", window_name, &cyan, 500, callbackAdjust); 59 createTrackbar("blue", window_name, &blue, 500, callbackAdjust); 60 createTrackbar("magenta", window_name, &magenta, 500, callbackAdjust); 61 62 callbackAdjust(0, 0); 63 64 waitKey(); 65 return 0; 66 }
執行效果: 原圖: 使用預設引數值時的黑白圖片效果:

調整引數值後的黑白圖片效果(暗化綠背景、突出人臉(紅)):