opencv从零开始——3. 了解通道,对比度,亮度

来源:互联网 发布:美加净防晒霜 知乎 编辑:程序博客网 时间:2024/06/06 17:10

1. 前言

常规来看,有3个通道,即RGB。

但是在Opencv中,编程的时候,顺序是BGR,即蓝色,绿色,红色,这一点不能弄错了。

Opencv可以对这3个通道,进行分别显示和调整。


2. 例子

代码如下:
#include <opencv2/core/core.hpp>#include <opencv2/highgui/highgui.hpp>#include <iostream>using namespace cv;using namespace std;bool MultiChannelBlending(int rgb);void ShowHelpText();//"/mnt/hgfs/code_for_Linux/code_opencv/test1/pic/v1.jpg"int main(int argc, char* argv[]){    MultiChannelBlending(2);// 0 - 蓝色, 1 - 绿色, 2 - 红色    waitKey(0);    return 0;}bool MultiChannelBlending(int rgb){    Mat srcImage;    Mat logoImage;    vector<Mat> channels;    Mat imageChannel;    logoImage = imread("/mnt/hgfs/code_for_Linux/code_opencv/test1/pic/logo_kobe.jpg", 0);    srcImage  = imread("/mnt/hgfs/code_for_Linux/code_opencv/test1/pic/kobe2.jpg");    if (!logoImage.data || !srcImage.data) {        return false;    }    split(srcImage, channels);  //分离彩色通道    imageChannel = channels.at(rgb);    addWeighted(imageChannel(Rect(400, 200, logoImage.cols, logoImage.rows)),                1.0,                logoImage,                0.5,                0.0,                imageChannel(Rect(400, 200, logoImage.cols, logoImage.rows))                );    merge(channels, srcImage);  //将3个通道,重新组合成一个三通道    namedWindow("<1>科比 + logo");    imshow("<1>科比 + logo", srcImage);    return true;}


效果如下:





3. 对比度和亮度

代码如下:
#include <opencv2/core/core.hpp>#include <opencv2/highgui/highgui.hpp>#include <iostream>using namespace std;using namespace cv;static void on_ContrastAndBright(int, void *);int g_nContrastValue;int g_nBrightValue;Mat g_srcImage, g_dstImage;// "/mnt/hgfs/code_for_Linux/code_opencv/test1/pic/"int main(){    g_srcImage = imread("/mnt/hgfs/code_for_Linux/code_opencv/test1/pic/4.jpg");    if (!g_srcImage.data) {        return -1;    }    g_dstImage = Mat::zeros(g_srcImage.size(), g_srcImage.type());    g_nContrastValue = 80;    g_nBrightValue   = 80;    namedWindow("[效果图]", 1);    createTrackbar("对比度:", "[效果图]", &g_nContrastValue, 300, on_ContrastAndBright);    createTrackbar("亮度:", "[效果图]", &g_nBrightValue, 200, on_ContrastAndBright);    on_ContrastAndBright(g_nContrastValue, 0);    on_ContrastAndBright(g_nBrightValue, 0);    while (char(waitKey(1)) != 'q') {}    return 0;}static void on_ContrastAndBright(int, void *){    namedWindow("[原图]", 1);    for (int y = 0; y < g_srcImage.rows; ++y) {        for (int x = 0; x < g_srcImage.cols; ++x) {            for (int c = 0; c < 3; ++c) {                g_dstImage.at<Vec3b>(y,x)[c] =                        saturate_cast<uchar>((g_nContrastValue*0.01)*g_srcImage.at<Vec3b>(y,x)[c]                                             + g_nBrightValue);            }        }    }    imshow("[原图]", g_srcImage);    imshow("[效果]", g_dstImage);}

效果如下,通过滑动条来调整对比度和亮度:



4. 参考文献

[1] 毛星云 冷雪飞. OpenCV3编程入门[M]. 电子工业出版社, 2015.  114页



---

1 0
原创粉丝点击