gpt4 book ai didi

c++ - OpenCV:对 RGB 图像应用操作(拆分+合并)

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:37:42 24 4
gpt4 key购买 nike

抱歉,如果这个问题太基础了,我是 OpenCV 的新手。

我想对 RGB 图像应用直方图均衡化。 HE 只适用于单 channel ,所以我想我必须将图像分成 3 个不同的 channel ,将 HE 应用于每个 channel ,然后将它们合并在一起以形成输出均衡图像。

所以我就这样做了,这是我真正认为应该有效的程序:

#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;
}

如果//comments 有点烦人,我深表歉意,但我猜它显示了我的“推理”。在我点击“运行”按钮之前,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 channel 图像,而 rgb 是单 channel 图像。 cvEqualizeHist 不适用于 3 channel 图像。

您必须执行以下操作:

cvEqualizeHist( r, r );    //equalise r
cvEqualizeHist( g, g ); //equalise g
cvEqualizeHist( b, b ); //equalise b

关于c++ - OpenCV:对 RGB 图像应用操作(拆分+合并),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14708572/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com