我需要从输入图像计算Hu矩。输入图像input
由多个对象组成,因此我需要使用连接组件标记功能对其进行预处理:
# input image is thresholded
(T, thresh) = cv2.threshold(input, 90, 255, cv2.THRESH_BINARY)
# getting the labels of the connected components
output = cv2.connectedComponentsWithStats(thresh, 4, cv2.CV_32S)
num_labels = output[0]
labels = output[1]
stats = output[2]
centroids = output[3]
# for every component in the output image
for c in centroids[1:num_labels]:
img_moments = cv2.moments(c)
hu = cv2.HuMoments(img_moments)
然而,这并没有给我正确的组件的Hu矩值。最初我使用阈值图像来获取时刻cv2.moments(thresh)
,但是当它们是图像中的多个组件时,这没有用。我正在使用Python 2和OpenCV 3。
更新:仅为了记录,我已经获得了正确数量的图片标签,在这种情况下input
图片有10个组件+ 1个背景标签,那11个标签,I知道第一个标签是背景,因此数组值都是零。我想获取其余标签的值(从1到n标签),并将这些值解析为Numpy数组,以便单独计算时刻。
更新2:添加了阈值化的源图像。
答案 0 :(得分:0)
我设法通过使用每个标签stats = output[2]
的统计信息输出提供的信息来解决我的问题。
通过这些信息,我为输入图像中的每个组件创建了一个ROI(感兴趣区域),然后我计算了图像时刻和ROI的Hu矩获得所需的输出值。
提出的解决方案如下:
# for every component in the output image
for label in range(num_labels):
# retrieving the width of the bounding box of the component
width = stats[label, cv2.CC_STAT_WIDTH]
# retrieving the height of the bounding box of the component
height = stats[label, cv2.CC_STAT_HEIGHT]
# retrieving the leftmost coordinate of the bounding box of the component
x = stats[label, cv2.CC_STAT_LEFT]
# retrieving the topmost coordinate of the bounding box of the component
y = stats[label, cv2.CC_STAT_TOP]
# creating the ROI using indexing
roi = thresh[y:y+height, x:x+width]
# calculating the image moments and Hu moments of the ROI
img_moments = cv2.moments(roi)
hu = cv2.HuMoments(img_moments)
我确信在输入图像中还有其他方法可以对连接的组件进行分段,但目前这个方法正在为我工作。