我在目标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:
黑白图片:
答案 0 :(得分:2)
首先,您拥有的图像输出不是黑白(二进制)图像。这是一个灰度图像。
此灰度图像是256色(0-255)的单通道图像,而二进制图像中只有0(黑色)或255(白色)。
您可以使用阈值(cvThreshold)将其从灰度转换为二进制。有许多二值化算法可以帮助您实现您的需求。局部二值化方法更具适应性,也可以帮助去除阴影区域的部分。
希望这有帮助。
答案 1 :(得分:1)
查看伽马校正。我假设在这种情况下需要调整伽玛值以适应图像中线条的对比度。由于它是一个模糊的图像,你也发现了一些麻烦。你可能还想增加一些对比度,而你就是这样。
<强>链接:强>
答案 2 :(得分:1)
答案 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;
}
结果: