2013-03-11 239 views
2

我需要将具有3个通道的CV_8U图像转换为必须是单通道CV_32S的图像。但是当我试图这样做时,我得到的图像全是黑色的。我不明白为什么我的代码无法正常工作。OpenCV:将CV_8UC3图像转换为C++中的CV_32S1图像

我正在处理灰度图像,这就是为什么我将3通道图像分成单通道图像的矢量,然后只处理第一个通道。

//markers->Image() returns a valid image, so this is not the problem 

cv::Mat dst(markers->Image().size(), CV_32SC1); 
dst = cv::Scalar::all(0); 
std::vector<cv::Mat> vectmp; 
cv::split(markers->Image(), vectmp); 
vectmp.at(0).convertTo(dst, CV_32S); 

//vectmp.at(0) is ok, but dst is black...? 

在此先感谢您。

+1

你为什么不先做灰度转换,即考虑所有三个颜色通道? – 2013-03-11 11:24:07

回答

3

您是否试图获取结果图像的值?像这样:

for (int i=0; i<result.rows; i++) 
{ 
    for (int j=0; j<result.cols; j++) 
    { 
     cout << result.at<int>(i,j) << endl; 
    } 
} 

我已经转换(也用于convertTo)无规灰度单通道图像CV_32S(它是为每个像素有符号的32位整数值)我的输出是这样的:

80 
111 
132 

当我试图显示它时,我也会得到黑色图像。从documentation

如果图像是16位无符号或32位的整数,所述像素是 由256被划分,值的范围[0,255 * 256]被映射到 [0,255]。

因此,如果你将这些小数除以255,你会得到0(int类型)。这就是为什么imshow显示黑色图像。

0

如果要显示32位图像并看到有意义的结果,则需要在调用imshow之前将其所有元素相乘256。否则,imshow会将您的值缩小到零,并且您会看到一个黑色图像(正如Astor指出的那样)。

由于原始值是8位无符号的,因此它们必须小于255.因此,将它们乘以256是安全的,不会溢出32位整数。

编辑我才意识到你的输出类型是签署 32位整数,但原来的类型是无符号 8位整数。在这种情况下,您需要适当缩放您的值(查看scaleAdd)。

最后,在开始丢弃图像通道之前,您可能需要确保图像采用YCbCr格式。

0

我相信这就是你要找的。将您的图像转换为8位单通道。 CV_8UC1。您是从一个8位图像开始,将其更改为32位单通道?为什么?保持8位。

0

我有同样的问题,试图将8UC1转换为32S而不是8UC3来间接解决它。

RgbToGray接受使用8UC3或8UC1元素类型创建灰色图像。 8UC1图像是我的标记图像。

我在Opencvsharp做到了这一点:

Mat buf3 = new Mat(iplImageMarker); 
buf3.ConvertTo(buf3, MatType.CV_32SC1); 
iplImageMarker= (IplImage)buf3; 

iplImageMarker=iplImageMarker* 256;