OpenCV分通道显示图片,灰度,融合,直方图,彩色直方图
代码有参考跟整合:没有一一列出出处
// split_rgb.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include <iostream>
#include <vector> #include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp" #include <cv.h>
#include <highgui.h> using namespace std;
using namespace cv; #pragma comment(lib,"opencv_highgui244d.lib")
#pragma comment(lib,"opencv_core244d.lib")
#pragma comment(lib,"opencv_imgproc244d.lib") void split_image(const char* image_name)
{
Mat image_src = imread(image_name);
Mat image_dst;
vector<Mat> bgr; //颜色通道分离
//输入图像
//分离后各通道
split(image_src,bgr); //颜色通道合成
//输入各通道
//输入图像
merge(bgr,image_dst); //用彩色图像形象的表示一下,除了原通道保留,其余两通道置0
Mat tmp(image_src.size(),CV_8U,Scalar(0));
vector<Mat> b,g,r; //用来表示的彩色图像 for(int i=0;i<3;i++)
{
if(i==0)
b.push_back(bgr[0]);
else
b.push_back(tmp); if(i==1)
g.push_back(bgr[1]);
else
g.push_back(tmp); if(i==2)
r.push_back(bgr[2]);
else
r.push_back(tmp);
}
Mat image_b,image_g,image_r; merge(b,image_b);
merge(g,image_g);
merge(r,image_r); namedWindow( "b", CV_WINDOW_AUTOSIZE );
namedWindow( "g", CV_WINDOW_AUTOSIZE );
namedWindow( "r", CV_WINDOW_AUTOSIZE );
namedWindow( "dst", CV_WINDOW_AUTOSIZE );
imshow("b",image_b); imshow("g",image_g); imshow("r",image_r); imshow("dst",image_dst);
moveWindow("dst", 1,1);
moveWindow("b",800,1);
moveWindow("g",1,500);
moveWindow("r",900,500); //waitKey(1);
//waitKey(0); } void split_image_gray(const char* image_name)
{
Mat image_src = imread(image_name);
Mat image_dst;
vector<Mat> bgr; //颜色通道分离
//输入图像
//分离后各通道
split(image_src,bgr); //颜色通道合成
//输入各通道
//输入图像 imshow("B_channel",bgr[0]);
imshow("G_channel",bgr[1]);
imshow("R_channel",bgr[2]);
//waitKey(1); } //计算和绘制直方图(R,G,B)
/* img 通道图像
* hist_img: 直方图的绘图图像
* pstrWndName: 绘图窗口
*/
void draw_histogram(IplImage* img,IplImage* hist_img,const char* pstrWndName)
{ CvHistogram* hist = NULL; int bin_count = 256;
float range[] = {0,255};
float* ranges[]={range}; hist = cvCreateHist(1, //一维
&bin_count, //每一维上bin(直方柱)的个数, 此处为 256 【由上述两个参数,函数/就会创建一个1*256的矩阵】
CV_HIST_ARRAY,
ranges,
1);
cvClearHist(hist); //防止初始化时有其它数据,先清理一下 cvCalcHist(&img,hist,0,0); //得到直方图的最值及标号
float min,max;
int min_idx,max_idx;
cvGetMinMaxHistValue(hist,&min,&max,&min_idx,&max_idx); //cout<<"min: "<<min<<" max:"<<max<<endl;
if(max == 0) {cout<<"max =0 err!"<<endl;max = 100;} //缩放直方图的大小,和图像相适应
cvScale(hist->bins,hist->bins,((double)hist_img->height)/max,0); //设置所有的直方图的数值为255
cvSet(hist_img,cvScalarAll(255),0); // 平均每个直放柱的宽度
int bin_w=cvRound((double)hist_img->width/bin_count); //画直方图
for(int i=0;i<bin_count;i++)
{
cvRectangle(hist_img,
cvPoint(i*bin_w,hist_img->height), //左下角的点(i*bin_w,height)
cvPoint((i+1)*bin_w, hist_img->height-cvRound(cvGetReal1D(hist->bins,i))),//右上角的点((i+1)*bin_w,图像高度-直方柱的高度)
cvScalarAll(0),
-1,
8,
0);
} //显示直方图
cvShowImage(pstrWndName,hist_img);
cvWaitKey(1);
} void historgram_channel(const char* image_name)
{
IplImage* image_src = cvLoadImage(image_name,1); //创建窗口
const char* pstrBHistWnd = "b plane";
const char* pstrGHistWnd = "g plane";
const char* pstrRHistWnd = "r plane";
cvNamedWindow(pstrBHistWnd,1);
cvNamedWindow(pstrGHistWnd,1);
cvNamedWindow(pstrRHistWnd,1); //B G R 通道
CvSize img_size;img_size.width = image_src->width;img_size.height = image_src->height;
IplImage* b = cvCreateImage(img_size,8,1);
IplImage* g = cvCreateImage(img_size,8,1);
IplImage* r = cvCreateImage(img_size,8,1);
//分割BGR通道
cvSplit(image_src,b,g,r,0); CvSize size;size.width = image_src->width;size.height = image_src->height;
IplImage* b_hist_img = cvCreateImage(size,8,1);
IplImage* g_hist_img = cvCreateImage(size,8,1);
IplImage* r_hist_img = cvCreateImage(size,8,1); //绘制直方图
draw_histogram(b,b_hist_img,pstrBHistWnd);
draw_histogram(g,g_hist_img,pstrGHistWnd);
draw_histogram(r,r_hist_img,pstrRHistWnd); } int _tmain(int argc, _TCHAR* argv[])
{
char* image_name = "swan.jpg";
split_image(image_name);
split_image_gray(image_name);
historgram_channel(image_name); waitKey(0); getchar();
return 0;
}
实现效果:
彩色直方图:
#include <cv.h>
#include <highgui.h>
#include <iostream>
using namespace std; int main( int argc, char** argv )
{
IplImage * src= cvLoadImage("F:\\test3.jpg"); IplImage* hsv = cvCreateImage( cvGetSize(src), 8, 3 );
IplImage* h_plane = cvCreateImage( cvGetSize(src), 8, 1 );
IplImage* s_plane = cvCreateImage( cvGetSize(src), 8, 1 );
IplImage* v_plane = cvCreateImage( cvGetSize(src), 8, 1 );
IplImage* planes[] = { h_plane, s_plane }; /** H 分量划分为16个等级,S分量划分为8个等级 */
int h_bins = 16, s_bins = 8;
int hist_size[] = {h_bins, s_bins}; /** H 分量的变化范围 */
float h_ranges[] = { 0, 180 }; /** S 分量的变化范围*/
float s_ranges[] = { 0, 255 };
float* ranges[] = { h_ranges, s_ranges }; /** 输入图像转换到HSV颜色空间 */
cvCvtColor( src, hsv, CV_BGR2HSV );
cvCvtPixToPlane( hsv, h_plane, s_plane, v_plane, 0 ); /** 创建直方图,二维, 每个维度上均分 */
CvHistogram * hist = cvCreateHist( 2, hist_size, CV_HIST_ARRAY, ranges, 1 );
/** 根据H,S两个平面数据统计直方图 */
cvCalcHist( planes, hist, 0, 0 ); /** 获取直方图统计的最大值,用于动态显示直方图 */
float max_value;
cvGetMinMaxHistValue( hist, 0, &max_value, 0, 0 ); /** 设置直方图显示图像 */
int height = 240;
int width = (h_bins*s_bins*6);
IplImage* hist_img = cvCreateImage( cvSize(width,height), 8, 3 );
cvZero( hist_img ); /** 用来进行HSV到RGB颜色转换的临时单位图像 */
IplImage * hsv_color = cvCreateImage(cvSize(1,1),8,3);
IplImage * rgb_color = cvCreateImage(cvSize(1,1),8,3);
int bin_w = width / (h_bins * s_bins);
for(int h = 0; h < h_bins; h++)
{
for(int s = 0; s < s_bins; s++)
{
int i = h*s_bins + s;
/** 获得直方图中的统计次数,计算显示在图像中的高度 */
float bin_val = cvQueryHistValue_2D( hist, h, s );
int intensity = cvRound(bin_val*height/max_value); /** 获得当前直方图代表的颜色,转换成RGB用于绘制 */
cvSet2D(hsv_color,0,0,cvScalar(h*180.f / h_bins,s*255.f/s_bins,255,0));
cvCvtColor(hsv_color,rgb_color,CV_HSV2BGR);
CvScalar color = cvGet2D(rgb_color,0,0); cvRectangle( hist_img, cvPoint(i*bin_w,height),
cvPoint((i+1)*bin_w,height - intensity),
color, -1, 8, 0 );
}
} cvNamedWindow( "Source", 1 );
cvShowImage( "Source", src ); cvNamedWindow( "H-S Histogram", 1 );
cvShowImage( "H-S Histogram", hist_img ); cvWaitKey(0);
}
输入图像:
输出直方图:
OpenCV分通道显示图片,灰度,融合,直方图,彩色直方图的更多相关文章
- python中用opencv读取并显示图片
一.读取并显示图片: import matplotlib.pyplot as plt # plt 用于显示图片 import matplotlib.image as mpimg # mpimg 用于读 ...
- Opencv读取与显示图片
#include "stdafx.h"#include "cv.h"#include "cxcore.h"#include "hi ...
- opencv与mfc显示图片操作,MFC的鼠标响应在opencv图片上失效,opencv滚轮事件没有响应问题描述解决。
原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/11588758.html 用mfc 与OPENCV编写成. 出了很多冲突异常事件导致鼠标操作没有 ...
- 纯Python综合图像处理小工具(1)分通道直方图
平时工作经常需要做些图像分析,需要给图像分通道,计算各个通道的直方图分布特点,这个事儿photoshop也能做,但是用起来不方便,且需要电脑上安装有PS软件,如果用OpenCV, 更是需要在visua ...
- python 读取并显示图片的两种方法
在 python 中除了用 opencv,也可以用 matplotlib 和 PIL 这两个库操作图片.本人偏爱 matpoltlib,因为它的语法更像 matlab. 一.matplotlib 1. ...
- OpenCV 2.2版本号以上显示图片到 MFC 的 Picture Control 控件中
OpenCV 2.2 以及后面的版本号取消掉了 CvvImage.h 和CvvImage.cpp 两个文件,直接导致了苦逼的程序猿无法调用里面的显示函数来将图片显示到 MFC 的 Picture Co ...
- c++ opencv 3.2 +Mfc VS2015窗体显示图片方法
本文仅涉及一些核心步骤,具体 OpenCV 的配置以及其他的细节问题,请参考 VS2010 / MFC + OpenCV 2.4.1打开图片. 1. 新建 MFC 对话框项目 基于对话框,不使用Uni ...
- OpenCV实现灰度直方图和直方图拉伸
原文链接:http://blog.csdn.net/xiaowei_cqu/article/details/7600666 如有疑问或者版权问题,请移步原作者或者告知本人. 灰度直方图是数字图像中最简 ...
- opencv java swing 图片灰度化 二值化
工程下载地址 https://download.csdn.net/download/qq_16596909/11503860 基于maven 首先引入opencv <!-- https://mv ...
随机推荐
- Linux服务器集群系统(LVS)
from:http://www.linuxvirtualserver.org/zh/lvs1.html#5 本文介绍了Linux服务器集群系统--LVS(Linux Virtual Server)项目 ...
- springMVC系列之(三) spring+springMVC集成(annotation方式)
个人认为使用框架并不是很难,关键要理解其思想,这对于我们提高编程水平很有帮助.不过,如果用都不会,谈思想就变成纸上谈兵了!!!先技术,再思想.实践出真知. 1.基本概念 1.1.Spring Spri ...
- 使用IDEA运行Spark程序
使用IDEA运行Spark程序 1.安装IDEA 从IDEA官网下载Community版本,解压到/usr/local/idea目录下. tar –xzf ideaIC-13.1.4b.tar.gz ...
- android git上开源的项目收藏
本文为那些不错的Android开源项目第一篇--个性化控件(View)篇,主要介绍Android上那些不错个性化的View,包括ListView.ActionBar.Menu.ViewPager.Ga ...
- SSH深度历险(七) 剖析SSH核心原理(一)
接触SSH有一段时间了,但是对于其原理,之前说不出来莫模模糊糊(不能使用自己的语言描述出来的就是没有掌握),在视频和GXPT学习,主要是实现了代码,一些原理性的内容还是欠缺的,这几天我自己也一直在反问 ...
- Dynamics CRM 2015Online Update1 new feature之 通过业务规则清空字段的值
自2013引入业务规则后很多的功能就不需要通过javascript来实现,业务人员直接通过配置就能解决.那随着版本的更新业务规则的功能也越来越强大,从之前很单纯的逻辑到后面的if..else,相信后面 ...
- Java进阶(三十六)深入理解Java的接口和抽象类
Java进阶(三十六)深入理解Java的接口和抽象类 前言 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太 ...
- (七十二)自定义通知NSNotification实现消息传递
众所周知,iOS中一般在类之间传递消息使用较多的是delegate和block,还有一种是基于通知进行的消息传递,我们常常是使用系统的通知,来实现一些功能,例如利用键盘尺寸改变的通知,我们可以根据键盘 ...
- [GitHub]第五讲:团队合作流程
文章转载自:http://blog.csdn.net/loadsong/article/details/51591631 前几天还都是一个开发者唱独角戏.但是尽管如此也可以看出 Git 带来的便利了, ...
- Java学习从菜鸟变大鸟之二 输入输出流(IO)
在软件开发中,数据流和数据库操作占据了一个很重要的位置,所以,熟悉操作数据流和数据库,对于每一个开发者来说都是很重要的,今天就来总结一下JavaI/O. 流 流是一个很形象的概念,当程序需要读取数据的 ...