打开CV图像效果

时间:2012-11-05 10:06:16

标签: iphone ios image-processing opencv

我在目标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];

}

由于

orignal image:

enter image description here

黑白图片:

enter image description here

4 个答案:

答案 0 :(得分:2)

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

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

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

希望这有帮助。

答案 1 :(得分:1)

查看伽马校正。我假设在这种情况下需要调整伽玛值以适应图像中线条的对比度。由于它是一个模糊的图像,你也发现了一些麻烦。你可能还想增加一些对比度,而你就是这样。

<强>链接:

Understanding Gamma Correction

Wikipedia - Gamma Correction

OpenCV Gamma Correction (C++)

Changing contrast and brightness of an image - OpenCV

答案 2 :(得分:1)

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

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

enter image description here

Here您可以阅读有关直方图均衡的信息。

答案 3 :(得分:0)

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

这是a useful link,解释了在非均匀照明条件下的二值化。

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;

}

结果: enter image description here