在OpenCV中将RGB转换为黑白
c
c++
computer-vision
image-processing
10
0

我想知道如何将RGB图像转换为黑白(二进制)图像。

转换后,如何将修改后的图像保存到磁盘?

参考资料:
Stack Overflow
收藏
评论
共 5 个回答
高赞 时间 活跃

一种“二值化”图像的简单方法是将其与阈值进行比较:例如,您可以使用c ++中的opencv将矩阵中的所有元素与值进行比较

cv::Mat img = cv::imread("image.jpg", CV_LOAD_IMAGE_GRAYSCALE); 
cv::Mat bw = img > 128;

这样,矩阵中所有大于128的像素现在都是白色,而小于128或等于128的像素将是黑色

(可选)对我来说,效果很好是应用模糊

cv::blur( bw, bw, cv::Size(3,3) );

稍后,您可以按照之前的说明保存它:

cv::imwrite("image_bw.jpg", bw);
收藏
评论

AFAIK,您必须将其转换为灰度,然后将其阈值设置为二进制。

1.将图像读取为灰度图像如果要从磁盘读取RGB图像,则可以直接将其读取为灰度图像,如下所示:

// C
IplImage* im_gray = cvLoadImage("image.jpg",CV_LOAD_IMAGE_GRAYSCALE);

// C++ (OpenCV 2.0)
Mat im_gray = imread("image.jpg",CV_LOAD_IMAGE_GRAYSCALE);

2.将RGB图像im_rgb转换为灰度图像 :否则,您必须将先前获得的RGB图像转换为灰度图像

// C
IplImage *im_rgb  = cvLoadImage("image.jpg");
IplImage *im_gray = cvCreateImage(cvGetSize(im_rgb),IPL_DEPTH_8U,1);
cvCvtColor(im_rgb,im_gray,CV_RGB2GRAY);

// C++
Mat im_rgb  = imread("image.jpg");
Mat im_gray;
cvtColor(im_rgb,im_gray,CV_RGB2GRAY);

3.转换为二进制您可以使用自适应阈值固定级别阈值将灰度图像转换为二进制图像。

例如,在C中,您可以执行以下操作(您也可以在C ++中使用Mat和相应的功能执行相同的操作):

// C
IplImage* im_bw = cvCreateImage(cvGetSize(im_gray),IPL_DEPTH_8U,1);
cvThreshold(im_gray, im_bw, 128, 255, CV_THRESH_BINARY | CV_THRESH_OTSU);

// C++
Mat img_bw = im_gray > 128;

在上面的示例中,阈值为128。

4.保存到磁盘

// C
cvSaveImage("image_bw.jpg",img_bw);

// C++
imwrite("image_bw.jpg", img_bw);
收藏
评论

简单的二进制阈值方法就足够了。

包括

#include <string>
#include "opencv/highgui.h"
#include "opencv2/imgproc/imgproc.hpp"

using namespace std;
using namespace cv;

int main()
{
    Mat img = imread("./img.jpg",0);//loading gray scale image
    threshold(img, img, 128, 255, CV_THRESH_BINARY);//threshold binary, you can change threshold 128 to your convenient threshold
    imwrite("./black-white.jpg",img);
    return 0;
}

您可以使用GaussianBlur获得平滑的黑白图像。

收藏
评论

我在一篇博客文章中做了类似的事情。显示了一个简单的C ++示例。

目的是使用开源cvBlobsLib库检测打印到微阵列载玻片上的斑点样品,但是要实现此目的,必须从颜色->灰度->黑+白转换图像。

收藏
评论

这似乎对我有用!

Mat a_image = imread(argv[1]);

cvtColor(a_image, a_image, CV_BGR2GRAY);
GaussianBlur(a_image, a_image, Size(7,7), 1.5, 1.5);
threshold(a_image, a_image, 100, 255, CV_THRESH_BINARY);
收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号