OpenCV:对RGB图像应用操作(拆分+合并)
OpenCV: Applying Operations on RGB Images (Split+Merge)
很抱歉,如果这个问题很基本,我是OpenCV的新手。
我想将直方图均衡应用于RGB图像。HE只适用于单个通道,所以我想我必须将图像分割成3个不同的通道,将HE应用于其中的每个通道,然后将它们合并在一起,形成输出均衡的图像。
所以我就这么做了,下面是我的程序,我真的相信它应该起作用:
#include <iostream>
#include <stdio.h>
#include <cv.h>
#include <highgui.h>
int main(int argc, char * argv[])
{
IplImage* img = cvLoadImage("/Users/Documents/red.jpg"); //Load image file
cvNamedWindow("Trans-in", CV_WINDOW_AUTOSIZE ); //Create input window
cvNamedWindow("Trans-out", CV_WINDOW_AUTOSIZE ); //Create output window
cvShowImage("Trans-in", img ); //Show input image in input window
//Create space for outputs rgb and its separate channels, r, g and b
IplImage* img0 = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 3); //rgb
IplImage* r = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1); //r
IplImage* g = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1); //g
IplImage* b = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1); //b
//cvZero(r);
//cvZero(g);
//cvZero(b);
cvSplit(img, b, g, r, NULL); //OpenCV likes it in BGR format
cvEqualizeHist( img, r ); //equalise r
cvEqualizeHist( img, g ); //equalise g
cvEqualizeHist( img, b ); //equalise b
cvMerge(b, g, r, NULL, img0); //merge all separate channels together to output image rgb
//cvReleaseImage(&r);
//cvReleaseImage(&g);
//cvReleaseImage(&b);
cvShowImage("Trans-out", img0); //Show output image in output window
cvWaitKey(0);
cvReleaseImage( &img);
cvReleaseImage( &img0);
cvDestroyWindow( "Trans-in");
cvDestroyWindow( "Trans-out");
return 0;
}
如果//评论有点烦人,我会道歉,但我想这表明了我的"推理"。Xcode没有抱怨,直到我按下"运行"按钮。它基本上崩溃了(显示了输入图像,但没有显示输出图像)。
加上底部的错误消息:
OpenCV Error: Assertion failed (CV_ARE_SIZES_EQ(src, dst) && CV_ARE_TYPES_EQ(src, dst) && CV_MAT_TYPE(src->type) == CV_8UC1) in cvEqualizeHist, file /opt/local/var/macports/build/_Volumes_work_mports_dports_graphics_opencv/opencv/work/OpenCV-2.4.3/modules/imgproc/src/histogram.cpp, line 2414 terminate called throwing an exception
我不知道这意味着什么,也不知道下一步该做什么。
您在以下行中错误地使用了cvEqualizeHist
函数:
cvEqualizeHist( img, r ); //equalise r
cvEqualizeHist( img, g ); //equalise g
cvEqualizeHist( img, b ); //equalise b
img
是3通道图像,而r
、g
和b
是单通道图像。cvEqualizeHist
不适用于3通道图像。
您必须执行以下操作:
cvEqualizeHist( r, r ); //equalise r
cvEqualizeHist( g, g ); //equalise g
cvEqualizeHist( b, b ); //equalise b
对于RGB图像进行直方图均衡。。。将其转换为HSV图像,然后均衡V平面。。。
- 将RGB转换为HSV
- 将HSV拆分为H、S和V
- 均衡V
-
合并H、S和V
vector<Mat> hsv_planes; cvtColor(image,image,CV_BGR2HSV); split(image,hsv_planes); equalizeHist(hsv_planes[2],hsv_planes[2]); merge(hsv_planes,image); cvtColor(image,image,CV_HSV2BGR);
相关文章:
- 使用C++程序合并排序没有得到正确的输出
- C++将向量的向量拆分为向量的N个子向量
- 用于合并排序的合并函数
- 在声明中合并两个常量"std::set"(不是在运行时)
- 如何拆分文件中.txt字母并使用c ++使用数组进行扑克?
- 如何将一个数组值合并为一个整数c++
- 如何将不同的可执行文件合并到一个窗口框架中进行编码?像浏览器一样
- OpenCV 4.1.2 - 从网络摄像头获取帧并将其拆分
- 将向量的 N 段合并到位C++
- 在C++中合并两个库
- 以迭代方式合并标准::unordered_map
- 使用 C++ 将命令行参数拆分为参数/向量
- C++(.cpp文件和.h文件)拆分代码并添加一个函数,提取 - 这很容易吗?
- 如何在C++中将数字拆分为数字
- 在线程之间拆分任务总是值得的吗?
- 将字符串拆分为标记,并将标记拆分为两个单独的数组
- 在 c++ 中拆分类和标头中的继承,错误
- 无法合并生成操作.. 先决条件不同
- 拆分和合并文本
- OpenCV:对RGB图像应用操作(拆分+合并)