系列文章:
用OpenCV实现Photoshop算法(四): 色阶调整用OpenCV实现Photoshop算法(五): 亮度对比度调整
用OpenCV实现Photoshop算法(六): 变为黑白图像
用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()方法 实施
灰度图像调整。
示范例程:
#include <iostream>
#include "opencv2/core.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"
#include "BlackWhite.hpp"
using namespace std;
using namespace cv;
#define BASE 200
static string window_name = "photo";
static Mat src;
static int red = 40 + BASE;
static int yellow = 60 + BASE;
static int green = 40 + BASE;
static int magenta = 60 + BASE;
static int blue = 20 + BASE;
static int cyan = 80 + BASE;
static void callbackAdjust(int , void *)
{
Mat dst;
BlackWhite b;
//set params
b.red = (red - BASE) / 100.0;
b.yellow = (yellow - BASE) / 100.0;
b.green = (green - BASE) / 100.0;
b.magenta = (magenta - BASE) / 100.0;
b.blue = (blue - BASE) / 100.0;
b.cyan = (cyan - BASE) / 100.0;
//adjust Black White
b.adjust(src, dst);
imshow(window_name, dst);
}
int main()
{
src = imread("girl.jpg");
if ( !src.data ) {
cout << "error read image" << endl;
return -1;
}
namedWindow(window_name);
//create trackbars
createTrackbar("red", window_name, &red, 500, callbackAdjust);
createTrackbar("yellow", window_name, &yellow, 500, callbackAdjust);
createTrackbar("green", window_name, &green, 500, callbackAdjust);
createTrackbar("cyan", window_name, &cyan, 500, callbackAdjust);
createTrackbar("blue", window_name, &blue, 500, callbackAdjust);
createTrackbar("magenta", window_name, &magenta, 500, callbackAdjust);
callbackAdjust(0, 0);
waitKey();
return 0;
}
运行效果:
原图:
使用默认参数值时的黑白图片效果:
调整参数值后的黑白图片效果(暗化绿背景、突出人脸(红)):