用OpenCV实现Photoshop算法(六): 变为黑白图像

系列文章:

用OpenCV实现Photoshop算法(一): 图像旋转

用OpenCV实现Photoshop算法(二): 图像剪切

用OpenCV实现Photoshop算法(三): 曲线调整

用OpenCV实现Photoshop算法(四): 色阶调整

用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 
#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;
}



运行效果:

原图:

用OpenCV实现Photoshop算法(六): 变为黑白图像_第1张图片


使用默认参数值时的黑白图片效果:

用OpenCV实现Photoshop算法(六): 变为黑白图像_第2张图片


调整参数值后的黑白图片效果(暗化绿背景、突出人脸(红)):

用OpenCV实现Photoshop算法(六): 变为黑白图像_第3张图片


你可能感兴趣的:(OpenCV,Photoshop,C++)