繁体   English   中英

如何使用 OpenCV 计算图像中黑色垂直线之间的对象数量?

[英]How to count number of objects between black vertical lines in a image using OpenCV?

我有这张iron-rod图像,我已经对图像进行了二值化( local_thresholding )并使用形态学操作( erosion )使用 opencv 将其转换为这个image-2

现在我想计算图像中存在的杆数。 如果您看到image-2 ,我需要计算两条垂直黑线之间的对象数。 我怎样才能做到这一点?

使用的代码:

from skimage import io, filters, transform, util, morphology, exposure, 
import cv2
import numpy as np

gray_image = io.imread('img1.jpeg')
gray_image = cv2.cvtColor(gray_image, cv2.COLOR_RGB2GRAY)
# binarize the image
gray_image1 = exposure.adjust_gamma(gray_image, gamma=1.4, gain=1.6)
local_threshold = filters.threshold_local(gray_image1, block_size=161, offset=3, mode='constant', cval=300)
binary_image = gray_image1 > local_threshold

erosion_binary = morphology.binary_erosion(binary_image, morphology.diamond(1))
# save the image
io.imsave('img2.png', util.img_as_ubyte(erosion_binary))

因此,一种可能的解决方案是从任一侧(左侧或右侧)开始并在图像上水平移动,检查每个像素是黑色还是白色。 您需要某种阈值条件,例如“如果我连续遇到 25 个黑色像素,然后到达一个白色像素,我必须在新杆的开始处”

注意:25 是任意的,可能对您不起作用,您必须四处寻找合适的阈值

我会在不同的 y 值(即不同的垂直起点)处多次执行此操作,并选择可能的平均值、中位数、众数等。

例子:

thresh = 25
num_rods = []
for y in range(5, height, 10):   # move on y-values 10 pixels apart from each other
    black_count = 0
    num_rods.append(0)
    for x in range(width):
        # increase black pixel count if we're at a black pixel
        if img[x][y] == 0:
            black_count += 1
        # if we reach the threshold AND hit a white pixel, increase rod count and reset the black pixel count
        elif black_count >= thresh and img[x][y] == 1:
            num_rods[-1] += 1
            black_count = 0

tot_num_rods = sum(num_rods) / len(num_rods)

这只是一个粗略的例子。 需要进行一些测试和玩来确定要使用的最佳条件和阈值。 还有其他方法或解决方案,但这是我的第一个想法,可能是我将如何解决这个问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM