gpt4 book ai didi

c++ - 带 OpenCV 的灰度 C++(出现一些噪音)

转载 作者:太空宇宙 更新时间:2023-11-03 23:00:13 25 4
gpt4 key购买 nike

我在制作手动功能时遇到了一些关于使用 openCV 转换为灰度的问题。这是我的代码。

主要.cpp

unsigned int height, width;
int main(int argc, char** argv)
{

IplImage* image_input = cvLoadImage("duck.jpg", CV_LOAD_IMAGE_UNCHANGED);
IplImage* image_output = cvCreateImage(cvGetSize(image_input),IPL_DEPTH_8U,1);

unsigned char *h_out = (unsigned char*)image_output->imageData;
unsigned char *h_in = (unsigned char*)image_input->imageData;

width = image_input->width;
height = image_input->height;

h_grayscale(h_in, h_out);

cvShowImage("Original", image_input);
cvShowImage("CPU", image_output);
cvReleaseImage(&image_input);
cvReleaseImage(&image_output);
waitKey(0);
}

这是我的灰度代码。

void h_grayscale( unsigned char* h_in, unsigned char* h_out)
{
for(int i=0;i<height;i++){
for(int j=0;j<width;j++){
int index = (i*j)*3;
double temp = 0.3*h_in[index]+0.6*h_in[index+1]+0.1*h_in[index+2];
h_out[i*j] = (unsigned char)temp;
}
}

但是结果并没有像它应该的那样执行,其中似乎有一些噪音。 appears some noise of grayscale image

我还没有找到哪里出错的代码。 :(谢谢。

最佳答案

您计算的输入和输出索引不正确。使用 OpenCV 图像时要记住的第一点是它们是对齐的,即每一行的末尾都填充了一些随机值。因此在计算彩色和灰度图像中像素的线性索引时,应该使用widthStep而不是width

计算像素索引的通用公式是:

i * widthStep/sizeof(type) + (channels * j)

其中i是行号,j是列号。

将上述公式翻译为当前案例,指数将按如下方式计算:

输入:

int index = i * colorWidthStep + (3 * j);

输出:

h_out[i * grayWidthStep + j] = (unsigned char)temp;

您可以创建 2 个额外的全局变量 colorWidthStepgrayWidthStep 以及 widthheight。初始化变量如下:

width     = image_input->width;
height = image_input->height;
colorWidthStep = image_input->widthStep;
grayWidthStep = image_output->widthStep;

关于c++ - 带 OpenCV 的灰度 C++(出现一些噪音),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20063840/

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