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

论坛 期权论坛 编程之家     
选择匿名的用户   2021-5-22 16:46   19   0

系列文章:

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



运行效果:

原图:




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



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



分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP