gpt4 book ai didi

OpenCV 理解灰度

转载 作者:太空宇宙 更新时间:2023-11-03 21:37:08 24 4
gpt4 key购买 nike

我对 OpenCV 如何将其颜色转换为灰度感到困惑。如果我向它发送一张只包含纯红、纯绿和纯蓝的图像(例如 {255,0,0}),我希望它能将其转换为值 255/3 = 85 的一致灰度,但这不是这样的。

我试过:

IplImage* src;
src=cvLoadImage("image.bmp", 0)
val = cvGetReal2D( src, y, x );

这给出了令人困惑的输出,将纯红色转换为 147,将纯绿色转换为 200,将纯蓝色转换为 95(我想我得到了正确的顺序)。灰色会按照您的预期进行转换(例如 {127,127,127} --> 127)。

然后我遇到了 cvCVTColor 函数,这似乎使用人眼 react 来加权转换(灰色 = 0.299*红色 + 0.587*绿色 + 0.114*蓝色):

IplImage *im_rgb  = cvLoadImage("image.bmp");
IplImage *im_gray = cvCreateImage(cvGetSize(im_rgb),IPL_DEPTH_8U,1);
cvCvtColor(im_rgb,im_gray,CV_RGB2GRAY);
val = cvGetReal2D( im_gray, y, x );

我已经通过拆分 channel 成功转换为我想要的:

IplImage* red_channel = cvCreateImage(cvSize(src->width, src->height), 8, 1);
IplImage* green_channel = cvCreateImage(cvSize(src->width, src->height), 8, 1);
IplImage* blue_channel = cvCreateImage(cvSize(src->width, src->height), 8, 1);
cvSplit( src, blue_channel , green_channel, red_channel , NULL);
val = ( cvGetReal2D( red_channel, y, x ) + cvGetReal2D( green_channel, y, x ) + cvGetReal2D( blue_channel, y, x ) ) / 3;

但我想从中了解 OpenCV 在使用 cvLoadImage 时如何转换为灰度和/或是否有一个函数可以在没有人眼 react 的情况下进行转换(即 Gray = (Red+Green+Blue)/3)?

最佳答案

我不认为存在单一函数,但您可以拆分 channel ,将每个 channel 与其系数相乘,然后将所有 channel 相加在一张图像中。

C++ 语法为:

int main()
{
cv::Mat color = cv::imread("lena.jpg");
cv::Mat red(color.rows, color.cols, CV_8UC1);
cv::Mat green(color.rows, color.cols, CV_8UC1);
cv::Mat blue(color.rows, color.cols, CV_8UC1);

std::vector<cv::Mat> output;
output.push_back(blue);
output.push_back(green);
output.push_back(red);

cv::split(color,output);

float r = 0.0f;
float g = 0.2f;
float b = 1.0f - (r + g);
cv::Mat graySelf = r*red + g*green + b*blue;
// could be computed with two calls of cv function addWeighted() in the same way!


cv::Mat grayCV;
cv::cvtColor(color,grayCV, CV_RGB2GRAY);

cv::namedWindow("cv"); cv::imshow("cv", grayCV);
cv::namedWindow("self"); cv::imshow("self", graySelf);
cv::namedWindow("color"); cv::imshow("color", color);

cv::imwrite("cv.png", grayCV);
cv::imwrite("self.png", graySelf);
cv::waitKey(-1);


return 0;
}

提供图片:

颜色:

enter image description here

打开简历:

enter image description here

self :

enter image description here

在 cvtColor 中,我猜 opencv 2.4.4 c++ 在 imgproc/src/color.cpp 内部使用这个函数片段:

int scn = srccn;
float cb = coeffs[0], cg = coeffs[1], cr = coeffs[2];
for(int i = 0; i < n; i++, src += scn)
dst[i] = saturate_cast<_Tp>(src[0]*cb + src[1]*cg + src[2]*cr);

关于OpenCV 理解灰度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20656030/

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