2017-06-04 57 views
-1

我在OpenCV中使用各种方法来预处理某些图像。我经常收到传递对象时与数据类型错误一直方法,例如:如何使用Python在OpenCV中检查和转换图像数据类型

import cv2 
import numpy as np 

#import image and select ROI 
image1 = cv2.imread('image.png') 
roi_1 = cv2.selectROI(image1) # spacebar to confirm selection 
cv2.waitKey(0) 
cv2.destroyAllWindows() 

# preprocesssing 
imCrop_1 = image1[int(roi_1[1]):int(roi_1[1]+roi_1[3]), int(roi_1[0]):int(roi_1[0]+roi_1[2])] 
grey1 = cv2.cvtColor(imCrop_1, cv2.COLOR_RGB2GRAY) 
thresh, bw_1 = cv2.threshold(grey1, 200, 255, cv2.THRESH_OTSU) 
canny_edge1 = cv2.Canny(bw_1, 50, 100) 

#test=roi_1 # Doesn't work with error: /home/bprodz/opencv/modules/photo/src/denoising.cpp:182: error: (-5) Type of input image should be CV_8UC3 or CV_8UC4! in function fastNlMeansDenoisingColored 
#test = imCrop_1 # works 
#test = grey1 # doesn't work with error above 
#test = bw_1 # doesn't work with error above 
#test = canny_edge1 # doesn't work with error above 

dst = cv2.fastNlMeansDenoisingColored(test,None,10,10,7,21) 

# Check object types 
type(imCrop_1) # returns numpy.ndarray - would like to see ~ CV_8UC3 etc. 
type(grey1) # returns numpy.ndarray 

目前我只是用试错,是没有办法,我可用于检查和不同对象类型之间的转换更加系统的方法?

回答

1

您可能正在使用错误的方法,为了这个目的,你也可以得到你所使用的方法名称的提示,为每cv2. fastNlMeansDenoisingColored文档:

SRC - 输入8位3通道图片。

dst - 与src具有相同大小和类型的输出图像。

所以,如果想使用cv2. fastNlMeansDenoisingColored,那么你需要到src垫转换为可以做一个3通道矩阵:

cv2.cvtColor(src, cv2.COLOR_GRAY2BGR) 

但如果你有灰度图像,然后您可以使用cv2.fastNlMeansDenoising,它接受单通道和三通道作为源码,并保存用于转换图像的步骤。

您也可以使用img.shape来检查给定矩阵的通道数量。它将返回(100,100)灰阶矩阵,(100,100,3)用于3通道矩阵,(100,100,4)用于4通道矩阵。你也可以使用img.dtype

+0

感谢你的建议,你知道是否有办法从Python中检查对象类型吗?当出现关于类型的错误时,我会询问类型,如“CV_8UC3”。有没有办法检查一个对象,看看它是什么类型?干杯。 – Bprodz

+1

我编辑了我的答案,以包含所需的更改。 – ZdaR

+0

顺便说一句,这个问题的目的实际上是关于检查和转换对象的类型,而不是如何让'cv2.fastN1MeansDenoising'工作 - 就像我在原来的问题中展示了哪种解决方案可行,还有'type()'的结果。我试过你提供的解决方案'img.dtype',但是这不会产生像'CV_8UC3'这样的东西。你可以参考我原来的问题中的评论,看看我想看什么以及我尝试过什么。谢谢。 – Bprodz