计算由多个像素d组成的边的长度

2024-06-25 06:49:04 发布

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

我已经做了一个工作流代码来检测图像中火焰的边缘。我可以得到边缘线。它由存储在一个数组中的许多像素点(代码中的数据)组成。现在根据数据,我想计算边缘的长度。其思想是计算数据中每个点之间的距离,并将它们相加得到长度。我真的坚持要做那件事。请帮帮我,谢谢。你知道吗

这是一个经过处理的图像:

enter image description here

这里是把原来的图像转换成处理过的图像,我在代码里放的是比较结果:

enter image description here

import cv2
import matplotlib.pyplot as plt


if __name__ == '__main__':
    path = '1897_1.jpg' #processed image
    pic = cv2.imread(path)
    original = cv2.imread('1897_2.jpg') #original image
    img2 = cv2.flip(original, 1)
    b,g,r = cv2.split(pic)
    img4 = cv2.flip(b, 1)
    h,w = img4.shape
    data = []
    th_val = 20
    for i in range(h):
        for j in range(w):
            val = img4[i, j]
            if (val >= th_val):
                data.append(j)
                break

    b1 = range(len(data))
    b2 = len(data)
    result = [b2]
    print (b2)

    plt.figure(figsize = (10, 8))
    plt.subplot(121)
    plt.imshow(img4)
    plt.plot(data, b1)
    plt.axis('off');
    plt.subplot(122)
    plt.plot(data, b1)
    plt.imshow(img2)
    plt.axis('off')

Tags: 数据代码图像importdataifrangeplt
1条回答
网友
1楼 · 发布于 2024-06-25 06:49:04

我提出了一个非常简单的解决方案,它远不是最优的,但它适用于本例,这是一个很好的起点。不幸的是,这种解决方案不是最佳的蓝色香奈儿,那里的曲线是不平滑的,但它适用于绿色和红色香奈儿。你知道吗

data包含第一个红色像素的宽度坐标。因此,所有第一个像素在垂直轴上被1个像素步距分开,在水平轴上被data[i+1] - data[i]分开。这两个值可以看作是squeare三角形的两个顶点,假设是我们要计算的距离。因此,解决方案如下:

length = 0

for i in range(0,len(data)-1):
    cathetus = data[i+1]-data[i]
    hypothenuse = (cathetus**2 + 1**2)**1/2
    length += hypothenuse

print(length)

更新 我提出了两种解决方案:一种是硬编码的,另一种是以函数的形式发布的。让我们从第一个开始:mean是一个相当好的信号+噪声近似器。在这种情况下,当您没有非常强的噪声或丢失数据时,您可以使用这种方法。在下面的示例中,我们用x in [1,2,3]选择点,然后计算这些点的平均值y,并将平均值指定给坐标x=2。接下来我们选择点x in [2,3,4],依此类推。结果,我们得到了带有y坐标的mean_data列表和带有x坐标的mean_x。我们可以用上述方法计算长度。您还可以通过对数据中的4个或更多点进行平均来提高平滑的能力。你知道吗

mean_data = []
mean_x = range(1,len(data)-1)
for i in range(0,len(data)-2):
    mean_d = (data[i] + data[i+1] + data[i+2])/3
    mean_data.append(mean_d)

另一种方法是使用scipy包中的平滑工具。其中一个描述如下。计算长度时,必须调整到新的x轴xnew。你知道吗

from scipy.interpolate import spline
import numpy as np
#transform to np.arrays initial data
b1_ = np.array(b1)
data_ = np.array(data)
# create new x with more data points
xnew = np.linspace(b1_.min(),b1_.max(),50) #50 is a number of points in between 
smoothed_data = spline(b1_,data_,xnew)

相关问题 更多 >