2017-07-29 77 views
0

以下是我对图像进行预处理的尝试。这涉及到以下步骤OpenCV返回黑白图像而不是灰度

  1. 应用蒙
  2. 作物的结果
  3. 最后,当我试图去从步骤3回到步骤2的255

缩放像素值,我得到一张黑白图像,而不是一张灰度图像。 以下是我的代码进行预处理

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

是什么原因导致的图像是黑色和WH迭代而不是灰度?

+0

数据类型的'crop'矩阵的是无符号的8位整数。将其乘以浮点标量不会改变这一点。 –

回答

2

这是因为数据的类别...我假设crop矩阵类是uchar,当你除以255时,输出为0或1(0到254之间的每个强度为零,255将是1),并且当在255你multipy输出的输出将是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; 
} 
相关问题