OpenCV實現Photoshop演算法(六): 變為黑白影象
阿新 • • 發佈:2020-10-12
變為黑白影象
將彩色圖片變成黑白灰度影象的演算法,一般是: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 #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 }
執行效果:
原圖:
使用預設引數值時的黑白圖片效果:
調整引數值後的黑白圖片效果(暗化綠背景、突出人臉(紅)):