在经过处理的结构中水平计算白色簇

时间:2019-06-13 17:45:36

标签: python-3.x opencv image-processing

我处理了织物材料以获得如下图所示的图像:

原始图片:

enter image description here

处理后的图像:

enter image description here

现在,我想连续查找白色簇的数量。如果所有聚类都是均匀且水平的,我将运行一个循环以计算强度的上升和下降,以找到聚类的数量,但事实并非如此。如果通过上述方法获取几行的中位数/均值,所需答案相差很大。

有没有办法在行不必完全水平的约束下准确地对它们进行计数?还是采用任何方法都可以使任务更简单?

2 个答案:

答案 0 :(得分:2)

我仍在进一步考虑这一点,但就目前而言, ImageMagick 确实对图像进行了校正。只需在终端(或Windows上的命令提示符)中:

 convert fabric.jpg -deskew 50% result.jpg

enter image description here

这是动画,如果您将图像从-20度旋转到+20度,将在右侧显示每行的投影(行总和)。在左侧变为水平时,观看最右边的列:

enter image description here

答案 1 :(得分:0)

我想您可以找到连接的组件数量,并获得如下所示的标签数量。这里 bp8OO.jpg 您的灰度图像。现在,我想您可以对此进行操作以找出每一行中的行数。

import cv2
import numpy as np

img = cv2.imread('bp8OO.jpg', 0)
img = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)[1]  # ensure binary
ret, labels = cv2.connectedComponents(img)

print("Number of labels" , len(labels))

def show_components(labels):
    # Map component labels to hue val
    label_hue = np.uint8(179*labels/np.max(labels))
    blank_ch = 255*np.ones_like(label_hue)
    labeled_img = cv2.merge([label_hue, blank_ch, blank_ch])

    # cvt to BGR for display
    labeled_img = cv2.cvtColor(labeled_img, cv2.COLOR_HSV2BGR)

    # set bg label to black
    labeled_img[label_hue==0] = 0

    cv2.imshow('labeled.png', labeled_img)
    cv2.waitKey()

show_components(labels)

enter image description here