OpenCV返回黑白图像而不是灰度图像

时间:2017-07-29 19:53:07

标签: c++ opencv grayscale

以下是我尝试预处理图像。这涉及以下步骤

  1. 涂抹面膜
  2. 裁剪结果
  3. 最后,将像素值缩放255
  4. 当我尝试从第3步返回到第2步时,我得到的是黑白图像而不是灰度图像。 以下是我执行预处理的代码

    cv::Mat maskCrop(std::string imageName, std::string maskName)
    {
        cv::Mat image,mask;
        image = cv::imread( imageName, CV_LOAD_IMAGE_GRAYSCALE);
        mask = cv::imread( maskName,CV_LOAD_IMAGE_GRAYSCALE);
        cv::Mat final_image;
        cv::resize(image, image, mask.size());  // make the size of mask and image same
    
        cv::bitwise_and(image, mask, final_image); //Apply mask
    
        // define rectangular window for cropping
        int offset_x = 1250;  // top left corner, for cropping
        int offset_y = 1550;
    
        cv::Rect roi;
        roi.x = offset_x;
        roi.y = offset_y;
        roi.width = 550;
        roi.height = 650;
    
        // Crop the original image to the defined ROI //
    
        cv::Mat crop = final_image(roi);
       //scale the image
        float beta = 1.0 / 255.0;
        crop *=beta;  // divide the max pixel vaue i.e. 255
    
        //Examinig whether scaling can be undone !!!!
        cv::imwrite("/home/dpk/Desktop/ip-rings/gray_image.jpg",crop*255);
    
        return crop;
    }
    

    以下是我尝试撤消缩放255(步骤3)

    时得到的输出

    Actual Output

    以下是预期的输出

    expected output

    是什么原因导致图像为黑白而不是灰度?

1 个答案:

答案 0 :(得分:2)

这是因为数据类......我假设crop矩阵类是uchar,当你除以255时,输出为0或1(0到254之间的每个强度为零, 255将是1)并且当您将输出乘以255时,输出将为0和255。 所以测试这段代码

{
.
.
cv::Mat crop = final_image(roi);
crop.convertTo(crop,
               CV_32F,       //New Type
               1.0f/255,     //Scaling
               0);           //offset
cv::imwrite("/home/dpk/Desktop/ip-rings/gray_image.jpg",crop*255);

return crop;
}