使用 OpenCV 将 RGB 图像转换为二进制图像

Posted

技术标签:

【中文标题】使用 OpenCV 将 RGB 图像转换为二进制图像【英文标题】:RGB image into binary image using OpenCV 【发布时间】:2013-06-08 03:20:59 【问题描述】:

所以,我是超级菜鸟,我正在尝试使用 OpenCV 将 RGB 图像转换为 C/C++ 中的二进制图像。我的第一个程序是这样的:

#include <opencv.hpp>

using namespace cv;

int main ( int argc, char **argv )

Mat im_gray = imread("img1.png",CV_LOAD_IMAGE_GRAYSCALE);

Mat im_rgb  = imread("img.png");
Mat im_gray;
cvtColor(im_rgb,im_gray,CV_RGB2GRAY);

Mat img_bw = im_gray > 128;

imwrite("image_bw.jpg", img_bw);

return 0;

但它显示“存在构建错误”并且只打开原始图像。我怎样才能做到正确?有人可以帮我吗?

输出是:

'opencv.exe': Loaded 'D:\Imagens\pibiti\opencv\Debug\opencv.exe', Symbols loaded.
'opencv.exe': Loaded 'C:\Windows\System32\ntdll.dll', Cannot find or open the PDB file
'opencv.exe': Loaded 'C:\Windows\System32\kernel32.dll', Cannot find or open the PDB file
'opencv.exe': Loaded 'C:\Windows\System32\KernelBase.dll', Cannot find or open the PDB file
'opencv.exe': Loaded 'D:\Imagens\pibiti\opencv\opencv\opencv_core230d.dll', Cannot find or open the PDB file
'opencv.exe': Loaded 'D:\Imagens\pibiti\opencv\opencv\opencv_highgui230d.dll', Cannot find or open the PDB file
'opencv.exe': Loaded 'C:\Windows\System32\msvcp100d.dll', Symbols loaded.
'opencv.exe': Loaded 'C:\Windows\System32\msvcr100d.dll', Symbols loaded.
'opencv.exe': Loaded 'C:\Windows\System32\user32.dll', Cannot find or open the PDB file
'opencv.exe': Loaded 'C:\Windows\System32\gdi32.dll', Cannot find or open the PDB file
'opencv.exe': Loaded 'C:\Windows\System32\ole32.dll', Cannot find or open the PDB file
'opencv.exe': Loaded 'C:\Windows\System32\oleaut32.dll', Cannot find or open the PDB file
'opencv.exe': Loaded 'C:\Windows\System32\advapi32.dll', Cannot find or open the PDB file
'opencv.exe': Loaded 'C:\Windows\WinSxS\x86_microsoft.windows.common-controls_6595b64144ccf1df_5.82.9200.16384_none_bf100cd445f4d954\comctl32.dll', Cannot find or open the PDB file
'opencv.exe': Loaded 'C:\Windows\System32\avifil32.dll', Cannot find or open the PDB file
'opencv.exe': Loaded 'C:\Windows\System32\msvfw32.dll', Cannot find or open the PDB file
'opencv.exe': Loaded 'C:\Windows\System32\avicap32.dll', Cannot find or open the PDB file
'opencv.exe': Loaded 'C:\Windows\System32\combase.dll', Cannot find or open the PDB file
'opencv.exe': Loaded 'C:\Windows\System32\msvcrt.dll', Cannot find or open the PDB file
'opencv.exe': Loaded 'C:\Windows\System32\rpcrt4.dll', Cannot find or open the PDB file
'opencv.exe': Loaded 'C:\Windows\System32\sechost.dll', Cannot find or open the PDB file
'opencv.exe': Loaded 'C:\Windows\System32\winmm.dll', Cannot find or open the PDB file
'opencv.exe': Loaded 'C:\Windows\System32\msacm32.dll', Cannot find or open the PDB file
'opencv.exe': Loaded 'C:\Windows\System32\shell32.dll', Cannot find or open the PDB file
'opencv.exe': Loaded 'C:\Windows\System32\version.dll', Cannot find or open the PDB file
'opencv.exe': Loaded 'C:\Windows\System32\winmmbase.dll', Cannot find or open the PDB file
'opencv.exe': Loaded 'C:\Windows\System32\shlwapi.dll', Cannot find or open the PDB file
'opencv.exe': Loaded 'C:\Windows\System32\imm32.dll', Cannot find or open the PDB file
'opencv.exe': Loaded 'C:\Windows\System32\msctf.dll', Cannot find or open the PDB file
'opencv.exe': Loaded 'C:\Windows\System32\cryptbase.dll', Cannot find or open the PDB file
'opencv.exe': Loaded 'C:\Windows\System32\bcryptprimitives.dll', Cannot find or open the PDB file
'opencv.exe': Loaded 'C:\Windows\System32\uxtheme.dll', Cannot find or open the PDB file
'opencv.exe': Loaded 'C:\Program Files\Iminent\Iminent.WinCore.dll', Binary was not built with debug information.
'opencv.exe': Loaded 'C:\Windows\System32\dwmapi.dll', Cannot find or open the PDB file
The thread 'Win32 Thread' (0xd9c) has exited with code -1073741510 (0xc000013a).
WinCore .dll DLL_PROCESS_DETACH:The program '[4136] opencv.exe: Native' has exited with code -1073741510 (0xc000013a).

PS.:使用 Windows 8 + Visual Studio 10 + OpenCV 2.3。

我正在尝试转换为二进制图像的图像:img1.png

【问题讨论】:

你在 `C:\Windows\System32` 的错误信息中有提到的 dll 吗? 【参考方案1】:
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>

//using namespace cv;

int main ( int argc, char **argv )

    cv::Mat im_gray;   // no nead to load the Mat with anything when declaring it.
    cv::Mat im_rgb  = cv::imread("img.png");
    cv::cvtColor(im_rgb, im_gray,CV_RGB2GRAY);
    // INSTEAD of the above two lines you could have cv::Mat im_gray = imread("img1.png",CV_LOAD_IMAGE_GRAYSCALE);

    // the following is an alternative to Mat img_bw = im_gray > 128
    cv::Mat img_bw;
    cv::threshold(im_gray, img_bw, 128.0, 255.0, THRESH_BINARY);

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

    return 0;
 

【讨论】:

【参考方案2】:

删除多余的Mat im_gray;,并将包含路径设置为OpenCV2.3/build/include,然后程序编译。

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

using namespace cv;

int main ( int argc, char **argv )

    Mat im_gray = imread("img1.png",CV_LOAD_IMAGE_GRAYSCALE);

    Mat im_rgb  = imread("img.png");
    cvtColor(im_rgb,im_gray,CV_RGB2GRAY);

    Mat img_bw = im_gray > 128;

    imwrite("image_bw.jpg", img_bw);

    return 0;
    

编辑:

#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
using namespace cv;

int main( int argc, char** argv )

    Mat img = imread( "C:/test/img1.png");
    cvtColor(img,img,CV_BGR2GRAY);
    Mat left=img(Rect(0,0,300,151));
    Mat right=img(Rect(300,0,img.cols-300,151));
    threshold(left,left,0,255,CV_THRESH_OTSU);
    threshold(right,right,0,255,CV_THRESH_OTSU);
    imshow("img",img);
    waitKey(0);
    return 0;
    

【讨论】:

感谢您的回答。我把 77 而不是 128 (Mat img_bw = im_gray > 128;) 我做得更好,但仍有一些数字不完整。知道如何解决这个问题吗?这里的结果docs.google.com/file/d/0BzUNc6BOkYrNNVNFZzAtenpvaWM/…

以上是关于使用 OpenCV 将 RGB 图像转换为二进制图像的主要内容,如果未能解决你的问题,请参考以下文章

将 CVD 图像转换为彩色 OpenCV 图像

使用 OpenCV 从 android Camera2 将 YUV 转换为 RGB ImageReader 时出现问题,输出图像为灰度

将 RGB 图像转换为 3 个 HSI 输出

将 RGB 图像数组乘以标量后使用 plt.imshow 获取黑色图

opencv python将图像读取为RGB

使用OpenCV从YUV颜色空间转换为RGB