-1

我在目标C中使用openCV。我想将图像转换为黑白,我已经完成了,但是我的输出黑白图像不清晰,图像上有黑色阴影。

任何人都可以帮忙吗?

- (IBAction)blackAndWhite:(id)sender {

imageView.image=orignalImage;

cv::Mat  dst;

cv::Mat src=[self cvMatFromUIImage:imageView.image];


if( !src.data )
{ cout<<"Usage: ./Histogram_Demo <path_to_image>"<<endl;
}

/// Convert to grayscale
cvtColor( src, src, CV_BGR2GRAY );

/// Apply Histogram Equalization
equalizeHist( src, dst );


imageView.image =[self UIImageFromCVMat:dst];

}

谢谢

原图:

在此处输入图像描述

黑白图像:

在此处输入图像描述

4

4 回答 4

2

首先,您拥有的图像输出不是黑白(二进制)图像。这是一个灰度图像。

此灰度图像是具有 256 种颜色(0-255)的单通道图像,而二值图像中只有 0(黑色)或 255(白色)。

您可以使用阈值(cvThreshold)将其从灰度转换为二进制。有许多可用的二值化算法也可以帮助您实现所需的目标。局部二值化方法的适应性更强,也可以帮助去除部分阴影区域。

希望这可以帮助。

于 2012-11-05T11:01:46.120 回答
1

研究伽玛校正。我假设在这种情况下需要调整伽马值以适应图像中线条的对比度。因为它是一个模糊的图像,你也会发现一些麻烦,我想。你可能还想增加一些对比度,当你在做的时候。

链接:

了解伽马校正

维基百科 - 伽玛校正

OpenCV 伽玛校正 (C++)

改变图像的对比度和亮度 - OpenCV

于 2012-11-05T10:20:56.540 回答
1

好吧,我不知道为什么已经有 3 个答案而且没有一个是正确的。

为什么将图像转换为灰度后应用图像均衡?没有它的输出如下:

在此处输入图像描述

在这里您可以阅读有关直方图均衡化的信息。

于 2012-11-05T12:58:42.850 回答
0

正如已经指出的那样,您并没有真正对图像进行二值化,而是将其转换为灰度。您可以使用二值化,cv::threshold但由于示例图像中的照明存在强烈的伪影,您最好使用cv::adaptiveThreshold确定局部阈值。

这是一个有用的链接,它解释了在非均匀照明条件下的二值化。

C++ 中的示例程序:

#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <cstdlib>

int
main(int argc, char **argv)
{

  cv::Mat image = cv::imread(argv[1], CV_LOAD_IMAGE_GRAYSCALE);
  assert(!image.empty());

  cv::Mat binary;
  cv::adaptiveThreshold(image, binary, 255, CV_ADAPTIVE_THRESH_MEAN_C, CV_THRESH_BINARY, 5, 7);

  cv::imshow("Orig", image);
  cv::imshow("Binary", binary);
  cv::waitKey(0);
  cv::imwrite("binary.png", binary);

  return EXIT_SUCCESS;

}

结果: 在此处输入图像描述

于 2012-11-06T11:02:59.723 回答