两问题:
(1)addWeighted中蓝色通道权重为0,为啥合并后颜色不变???
(2)为什么单独输出红色通道图像是灰色的?
(3)while (char(waitKey(1))!=’q’)//输入q未退出??
split()分离通道函数和merge()合并通道函数
1,split()分离通道函数
2,merge()合并通道函数
例子:原画+单通道logo色
#include<opencv2/opencv.hpp>
using namespace cv;
using namespace std;
//对全局函数进行声明
//
bool MutiChannelBlending();
//主函数
int main()
{
system("color F");// color of Background of window
if (MutiChannelBlending() )
{
printf("sucess!");
cout << endl << "\n运行成功,得出了需要的图像";//same function with the upper one, to make the window stay
}
waitKey(0);
return 0;
}
//选择颜色通道,与logo叠加后调色(split()分离通道函数,merge()合并通道函数)
//
//
bool MutiChannelBlending()
{
Mat aimag2 = imread("D://dota_jugg.jpg");
Mat logoimag2 = imread("D://dota_logo.jpg",0);//imread image(必须为灰度图像!!!)
if (!aimag2.data)//untersuchen,ob es falsch ist
{
printf("aimg is false!\n");
return 0;
}
if (!logoimag2.data)
{
printf("logoimg is false!\n");
return 0;
}
vector<Mat> channels;//建立通道容器
Mat imageBlueChannel;//定义蓝色通道图像
split(aimag2, channels);//分离彩色通道
imageBlueChannel = channels.at(0);//@@@@@将原图的蓝色通道赋予给imageBlueChannel
addWeighted(imageBlueChannel(Rect(500, 250, logoimag2.cols, logoimag2.rows)), 0, logoimag2, 0.5, 0, imageBlueChannel(Rect(500, 250, logoimag2.cols, logoimag2.rows) ));
imshow("(1)lan色通道图", imageBlueChannel);
merge(channels, aimag2);
namedWindow("(1)原画+logo蓝色通道");//addWeighted中蓝色通道权重为0,为啥合并后颜色不变???
imshow("(1)原画+logo蓝色通道", aimag2);
Mat imageGreenChannel;//定义绿色通道图像
split(aimag2, channels);//分离彩色通道
imageGreenChannel = channels.at(1);//@@@@@将原图的蓝色通道赋予给imageBlueChannel
addWeighted(imageGreenChannel(Rect(500, 250, logoimag2.cols, logoimag2.rows)), 1.0, logoimag2, 0.5, 0, imageGreenChannel(Rect(500, 250, logoimag2.cols, logoimag2.rows)));
imageBlueChannel = channels.at(0);//@@@@@将原图的蓝色通道赋予给imageBlueChannel
addWeighted(imageBlueChannel(Rect(500, 250, logoimag2.cols, logoimag2.rows)), 1.0, logoimag2, 0.5, 0, imageBlueChannel(Rect(500, 250, logoimag2.cols, logoimag2.rows))); //调通道比值可调logo颜色
merge(channels, aimag2);
namedWindow("(1)原画+logo(绿+蓝)色通道");
imshow("(1)原画+logo(绿+蓝)色通道", aimag2);
Mat imageRedChannel;//定义红色通道图像
split(aimag2, channels);//分离彩色通道
imageRedChannel = channels.at(2);//@@@@@将原图的蓝色通道赋予给imageBlueChannel
addWeighted(imageRedChannel(Rect(500, 250, logoimag2.cols, logoimag2.rows)), 1, logoimag2, 0.5, 0, imageRedChannel(Rect(500, 250, logoimag2.cols, logoimag2.rows)));//调通道比值可调logo颜色
imshow("(1)红色通道图", imageRedChannel);//为什么单独输出红色通道图像是灰色的?
merge(channels, aimag2);
namedWindow("(1)原画+logo红色通道",WINDOW_NORMAL);
imshow("(1)原画+logo红色通道", aimag2);
return true;
}
3,图像处理算子
4,访问图片中的像素
实例:滑动条调整图片对比度/亮度
#include<opencv2/opencv.hpp>
using namespace cv;
using namespace std;
//对全局函数进行声明
//
static void on_ContrastAndBrigt(int,void*);
//全局变量申明
int g_nContrastValue;//对比度
int g_nBrightValue;//亮度
Mat g_srcimage, g_dstimage;
//主函数
int main()
{
system("color F");// color of Background of window
g_srcimage = imread("D://2.jpg");
if (!g_srcimage.data) { printf("falsch!"); return false; }
g_dstimage = Mat::zeros(g_srcimage.size(), g_srcimage.type());
g_nContrastValue=80;//对比度,亮度初值
g_nBrightValue=80;
namedWindow("效果图", 1);
//创建轨迹条
createTrackbar("对比度:","效果图",&g_nContrastValue, 300, on_ContrastAndBrigt);
createTrackbar("亮度:", "效果图", &g_nBrightValue, 200, on_ContrastAndBrigt);
//调用回调函数
on_ContrastAndBrigt(g_nContrastValue, 0);
on_ContrastAndBrigt(g_nBrightValue, 0);
while (char(waitKey(1))!='q')//输入q未退出??
{
}
return 0;
}
static void on_ContrastAndBrigt(int, void*)
{
namedWindow("原始图窗口", 1);
for (int y = 0; y < g_srcimage.rows; y++)//三个循环,执行g_dstimage(i,j)=a*g_srcimage(i,j)+b
{
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);
}