这几天一直在跟着浅墨的博客学习OpenCV,关于【OpenCV入门教程之五】 分离颜色通道&多通道图像混合 本人提出一些自己的看法:
1、首先感谢浅墨的OpenCV教程,写的很详细,通俗易懂,受益匪浅,
http://blog.youkuaiyun.com/poem_qianmo/article/details/21176257
2、因为最初的设想是想将一张图片的颜色分别呈现出红色,蓝色,绿色,而不是像浅墨是将感兴趣的区域做颜色的变化。所以我首先是分离颜色通道,然后在将各种颜色通道与灰度图进行混合,这样就可以出现不同颜色的图像了。
3、分离颜色通道与混合,在浅墨的教程中讲的很清楚了,这里就不提了,直接上代码,并提出一些需要注意的地方。
//
// main.cpp
// OpenCV
//
// Created by 张雪鉴 on 14-12-10.
// Copyright (c) 2014年 张雪鉴. All rights reserved.
//
#include
using namespace cv;
int main(int argc, const char * argv[]) {
Mat img=imread("/Users/zhangxuejian/Pictures/nike.jpg"); //读取图像
Mat imgGray=imread("/Users/zhangxuejian/Pictures/nike.jpg",0 ); //读取灰度图像
vector
channels; //颜色通道,vector一定是小写的,Vector会出错
Mat imageGreenChannel,imageBlueChannel,imageRedChannel,imageYellowChannel,imagePurpleChannel,imageCyanChannel;
Mat red,green,blue;
split(img, channels); //把原图进行颜色的分离,红色在通道2,绿色通道1,蓝色通道0
red=channels.at(2);
addWeighted(red,1,imgGray,1,2,red); //因为red是从原图分离出来的红色通道,imgGray也是原图的灰度图,所以它们的尺寸是一样的,尺寸不一样就会出差
merge(channels,imageRedChannel); //此时红色通道已经变味red和imgGray的混合,所以通过merge再将3个通道进行混合,这是得出的便是红色的图像
green=channels.at(1); //同理green是绿色通道的引用
addWeighted(green,1,imgGray,1,1,green); //green与灰度图混合并重新返回给green
merge(channels,imageYellowChannel); //注意此时混合之后的颜色不会是绿色的了,因为在通道中已经存在上面处理后的red,所以此时混合后是红色和绿色的混合,也就是黄色
split(img, channels); //要想出现绿色的图像,我们需要对原图进行重新分离,所以一下代码的道理同上
green=channels.at(1);
addWeighted(green,1,imgGray,1,1,green);
merge(channels,imageGreenChannel); //绿色图像
blue=channels.at(0);
addWeighted(blue,1,imgGray,1,0,blue);
merge(channels,imageCyanChannel); //青色图像
split(img, channels);
blue=channels.at(0);
addWeighted(blue,1,imgGray,1,0,blue);
merge(channels,imageBlueChannel); //蓝色图像
red=channels.at(2);
addWeighted(red,1,imgGray,1,2,red);
merge(channels,imagePurpleChannel); //紫色图像
imshow("orginal", img);
imshow("gray", imgGray);
imshow("green", imageGreenChannel);
imshow("blue", imageBlueChannel);
imshow("red", imageRedChannel);
imshow("yellow", imageYellowChannel);
imshow("purple", imagePurpleChannel);
imshow("cyan", imageCyanChannel);
waitKey();
}
运行的结果: