从不同纵横比的谷物图像中提取特征

2024-10-01 04:57:18 发布

您现在位置:Python中文网/ 问答频道 /正文

上下文:

  1. 这张图片是从很远的地方拍摄的:Eg1
  2. 此图像取自closer:Eg2
  3. 这张图片是从非常近的地方拍摄的:Eg3

这主要是因为我设置的阈值if A < 300 or A > 1800: continue

def Cluster(I):
    I_detected = np.copy(I)
    contours, _ = cv2.findContours(I_detected, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)

    num = 0
    grain_coord = []
    area = []
    perimeter = []
    for c in contours:        
        A = cv2.contourArea(c)
        if A < 300 or A > 1800: 
            continue
        print(num, A)
        num += 1

        minAreaRect = cv2.minAreaRect(c)
        rectCnt = np.int64(cv2.boxPoints(minAreaRect))
        cv2.drawContours(I_detected, [rectCnt], 0, (0,0,0), 2)
        P = cv2.arcLength(c, closed=True)

        grain_coord.append(rectCnt)
        area.append(A)
        perimeter.append(P)

    return I_detected, num, np.array(grain_coord), area, perimeter

这个阈值很重要,因为如果我将阈值设置为变化很大,那么它也会拾取其他颗粒,但是我试图从颗粒中提取的特征也会变化很大。具体如下:

  1. Eg2.1
  2. Eg3.1

这些图像相同,但阈值设置为:if A < 300 or A > 3500: continue

结果/特点如下:

问题:

关注每个结果的前4列

结果1&;结果2主要在面积和周长上存在偏差,而高度和宽度差异不大

结果3在所有4个参数上完全不同,且存在显著差异

问题:

有没有一种方法可以让我不必担心拍摄图像的距离,同时还能使提取的特征变化最小

我只是在寻找一种方法来解决这个问题,或者找到一些替代方法来解决这个问题


Tags: or图像ifnp阈值areacv2num