【问题标题】:read pixel values of a binary image in opencv在opencv中读取二进制图像的像素值
【发布时间】:2015-09-01 02:45:36
【问题描述】:

我是 openCV 的新手。我想读取二进制灰度图像。我在 matlab 中打印了像素值,它只有 0 和 1,但是当我在 openCV 中读取相同的图像时,像素值介于 0 和255(而不仅仅是 0 和 255)。我想以像素仅为 0 或 1(或 0 和 255)的方式读取图像。 这就是我读取图像并打印像素值的方式:

Mat watermarkImage;  
watermarkImage = imread("C:\\path\\to\\image\\logo.png");
Mat wmrk = watermarkImage.clone();
Mat tmp2(64, 64, CV_32FC1);
resize(wmrk, wmrk , tmp2.size());
//wmrk.convertTo(wmrk,CV_32FC1, 1.0/255.0);
for(int i=0 ; i<64; i++)
{
    for(int j=0 ; j<64 ; j++)
    {
        cout<<int(wmrk.at<uchar>(i,j))<<"  ";
    }
    cout<<endl;
}

【问题讨论】:

  • 如果你想将 0-255 的垫子转换为 0/1 垫子(1 = 不是零的所有东西?)你可以加载为 uchar 灰度,然后 tmp = image > 0(然后一切都是0 或 255)。然后除以 255
  • resize() 将进行(线性)插值。你将不得不再次阈值()它
  • @berak 除非你使用INTER_NEAREST
  • @beaker,-对。不幸的是,LINEAR 是 default - 所以让我们来吧:要么使用 INTER_NEAREST ,要么再次使用阈值。

标签: matlab opencv mat


【解决方案1】:

请尝试以下方法:

Mat watermarkImage;  
// make sure you have a single channel image (grayscale):
watermarkImage = imread("C:\\path\\to\\image\\logo.png",CV_LOAD_IMAGE_GRAYSCALE);

Mat wmrk = watermarkImage .clone();
resize(wmrk, wmrk , cv::Size(64,64));

// create a binary image where each value is either 0 or 255
Mat mask = wmrk > 0; // or take any other threshold to mask values > thres

Mat binaryOnes = mask/255;



cout << binaryOnes<< endl;

/*
for(int i=0 ; i<wmrk.rows; i++)
{
    for(int j=0 ; j<wmrk.cols ; j++)
    {
        cout<< (int)(wmrk.at<uchar>(i,j))<<"  ";
    }
cout<<endl;
}
*/

获得二值图像的一种方法是应用阈值。在 OpenCV 中,二进制图像通常是 0 和 255,而不是 0 和 1,但如果需要,您可以轻松创建二进制图像并将值除以 255。

【讨论】:

    猜你喜欢
    • 2021-12-10
    • 1970-01-01
    • 2012-01-15
    • 1970-01-01
    • 2012-02-24
    • 2020-10-30
    • 1970-01-01
    • 1970-01-01
    • 2013-07-02
    相关资源
    最近更新 更多