opencv对比度亮度调整与通道分离

对比度亮度调整
1)原理介绍
g(x)=a*f(x)+b
& 参数f(x)表示原图像像素
& 参数g(x)表示输出图像像素
& 参数a(a>0),被称为增益(gain),通常用来控制图像的对比度 亮的越来越亮
& 参数b通常被称为偏置(bias),通常用来控制图像的亮度
g(i,j)=a*f(i,j)+b
方法实现

void On_ContrastAndBright(int,void* param)
{
   for(int i=0;i<srcImg.rows;i++)
   {
     for(int j=0;j<srcImg.cols;j++)
     {
     dstImg.at<Vec3b>(i,j)[0]=saturate_cast<uchar>((Contrast_Value *0.01)*srcImg.at<Vec3b>(i,j)[0]+Bright_Value);
     dstImg.at<Vec3b>(i,j)[1]=saturate_cast<uchar>((Contrast_Value*0.01)*srcImg.at<Vec3b>(i,j)[1]+Bright_Value);
     dstImg.at<Vec3b>(i,j)[2]=saturate_cast<uchar>((Contrast_Value*0.01)*srcImg.at<Vec3b>(i,j)[2]+Bright_Value);
     }
   }
imshow("原始图像",srcImg);
imhow(WIN_NAME,dstImg);
}

saturate_cast<uchar>
溢出保护:
if((data<0))
data=0;
else if(data>255)
data=255;
#include"opencv2/opencv.hpp"
using namespace cv;
#define WIN_NAME "输出图像"
int Contrase_Value=20;
int Bright_Value=20;
Mat srcImg;
Mat dstImg;
void Onchange(int,void *)
{
   for(int i=0;i<srcIMg.rows;i++)
   {
    for(int j=0;j<srcImg.cols;j++)
    {
    dstImg.at<Vec3b>(i,j)[0]=saturate_cast<uchar>(Contrase_Value*0.01*srcImg.at<Vec3b>(i,j)[0]+Bright_Value);
    dstImg.at<Vec3b>(i,j)[1]=saturate_cast<uchar>(Contrase_Value*0.01*srcImg.at<Vec3b>(i,j)[1]+Bright_Value);
    dstImg.at<Vec3b>(i,j)[2]=saturate_cast(Contrease_Value*0.01*srcImg.at<Vec3b>(1,j)[2]+Bright_Value);
    }
   }
  imshow("原图",srcImg);
  imshow(WIN_NAME,dstImg);
}

void main()
{
   Mat srcImg=imread("1.jpg");
   Mat dstImg=Mat::zeros(srcImg.size(),srcImg.type());
   //Mat::zero();//将矩阵元素都置为0
   //Mat::ones();//将矩阵元素都置为一
   namedWindow(WIN_NAME,CV_WINDOW_AUTOSIZE);
   createTrackbar("对比度",WIN_NAME,&Contrase_Value,300,Onchange,0);
   createTrackbar("亮度",WIN_NAME,&Bright_Value,200,Onchange,0);
   OnChange(Contrase_Value,0);//回调函数初始化做图像的显示
   OnChange(Bright_Value,0);
   waitKey(0);

}

应用,:对颜色明显的进行分离

三通道分离完是灰度图啊
哪个分量的分离出来会趋近于白色

1)通道分离:split()函数
CV_EXPORTS void split(const Mat &src,Mat *mvbegin);
CV_EXPORTS void split(const Mat & m,vector&mv);
ex:
Mat img=imread(“2.jpg”);
imshow(“src”,img);
vectorchannels;
Mat blueChannel,greenChannel,redChannel;
split(img,channels);
blueChannel=channels.at(0);
greenChannel=channels.at(1);
redChannel=channels.at(2);
imshow(“Blue”,blueChannel);
imshow(“Green”,greenChannel);
imshow(“Red”,redChannel);
waitKey(0);

2)通道合并: merge()函数
CV_EXPORTS void merge(const Mat *mv,size_t,count,OutputArray dst);
CV_EXPORTS void merge(const vector&mv,OutputArray dst);
ex:
Mat img=imread(“2.jpg”);
Mat mergeImg=Mat::zeros(img,size(),img.type());
imshow(“src”,img);
vectorchannels;
Mat blueChannel,greenChannel,redChannel;
split(img,channels);//通道分离
blueChannel=channels.at(0);
greenChannel=channels.at(1);
redChannel=channels.at(2);
//对每个通道做二值化处理
threshold(blueChannel,blueChannel,100,255,THRESH_BINARY);
threshold(greenChannel,greenChannel,100,255,THRESH_BINARY);
threshold(redChannel,redChannel,100,255,THRESH_BINARY);
merge(channels,mergeImg);//通道合并
imshow(“Merge”,mergeImg);

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值