为像素指定负值

时间:2014-02-15 08:43:22

标签: image matlab opencv image-processing pixel

使用某些标准,图像中有一些我不感兴趣的像素。所以,我想忽略它们。我只是想问一下我所遵循的方法是否可以接受。我已经为这些像素分配了一个负值。这可以接受吗?而且,当像素具有负值时,它意味着什么?它会在图像上有一些表示吗?

2 个答案:

答案 0 :(得分:2)

如果您的数据类型允许它,如有符号整数(CV_32S)或浮点(CV_32F或CV_64F),则使用负值非常有意义,这是指定忽略像素的一种非常常见的方法。在这种情况下,除了对它的解释之外,对负值没有特殊含义。

另一方面,如果你使用8位无符号图像(CV_8U),这可能会导致错误:它可能被截断为零或使用modulo-256加法转换为[0,255],具体取决于你的版本OpenCV的。在最坏的情况下,如果以非常糟糕的方式访问像素数据,它也可能溢出到邻居像素并修改它们的值。因此,如果使用8位图像,则应该使用掩码来指定忽略的像素,如phyrox所述。

答案 1 :(得分:1)

这取决于您如何使用图像。像素中的负值不具有任何真实表示。但是如果使用 Matlab 函数imshow(img,[]),它会将所有值都缩放为 -1 作为最小数字(因此它将在输出中表示)。 / p>

最好使用 掩码 。掩码是与图像大小相同的二进制数组,用于指示像素是否有效(1)或不是(0)。

例如,在 OpenCV 中,有很多函数可以使用掩码(最后一个参数const CvArr* mask = NULL)。 这里有一个关于如何在OpenCV中使用掩码的示例:

Mat srcImage; //RGB source image

//Create a mask. Here we select a rectangle:
Mat mask = Mat::zeros(srcImage.size(), CV_8U);  // type of mask is CV_8U
Mat roi(mask, cv::Rect(10,10,100,100));
roi = Scalar(255, 255, 255);

//Apply any function to the srcImage ONLY in the points selected by a mask
SurfFeatureDetector detector();
std::vector<KeyPoint> keypoints;
detector.detect(srcImage, keypoints, mask);     // passing `mask` as a parameter