【问题标题】:Convert RGB to Black & White in OpenCV在 OpenCV 中将 RGB 转换为黑白
【发布时间】:2010-12-07 19:37:16
【问题描述】:

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

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

【问题讨论】:

    标签: c++ c image-processing opencv computer-vision


    【解决方案1】:

    简单的二元阈值法就足够了。

    包括

    #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 获得平滑的黑白图像。

    【讨论】:

      【解决方案2】:

      这似乎对我有用!

      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);
      

      【讨论】:

        【解决方案3】:

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

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

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

        可选,对我来说效果不错的是应用模糊

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

        稍后你可以像之前所说的那样保存它:

        cv::imwrite("image_bw.jpg", bw);
        

        【讨论】:

        • 我不知道...我认为这取决于您保存的图像类型。对于照片(我正在处理照片)我认为是正确的格式。
        • 好吧,JPEG 的问题在于它引入了伪影并在一定程度上降低了图片的质量。我会使用 PNG 或带有 CCITT Fax 4 压缩的非常小的文件 TIFF。
        • @user1741137,如何使用 OpenCV 使用 CCITT Fax 4 压缩将 Mat 保存为 TIFF?使用 Highgui.imwrite("sample.tiff", binaryImage);我总是得到一个带有 LZW 压缩和 8 位色深的 TIFF - see my question here
        【解决方案4】:

        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。将im_rgb的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.转换为二进制 您可以使用adaptive thresholdingfixed-level thresholding 将灰度图像转换为二值图像。

        例如在 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);
        

        【讨论】:

        • 根据应用程序,您可能想要进行抖动而不是简单的阈值。
        • 在 CvtColor 函数中我们需要使用 CV_RGB2GRAY 还是 CV_BGR2GRAY。我已经读到 opencv 是基于 BGR 格式的,我们需要使用它,但是在灰色或二进制图像中,我在使用它们中的任何一个时都没有看到任何差异
        【解决方案5】:

        我在我的blog postings 之一中做了类似的事情。显示了一个简单的 C++ 示例。

        目的是使用开源cvBlobsLib 库进行检测 点样本打印到微阵列载玻片上,但图像必须是 如您所述,从颜色 -> 灰度 -> 黑色 + 白色转换,以实现这一目标。

        【讨论】:

        • 我想看看你的这个作品:图像必须从你提到的颜色 -> 灰度 -> 黑 + 白转换,谢谢
        • 上面的链接失效了,这个链接失效了:link
        猜你喜欢
        • 2013-09-17
        • 1970-01-01
        • 2011-11-29
        • 2018-12-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-29
        相关资源
        最近更新 更多