从一维信号中提取阶跃脉冲进行目标分割

2024-05-15 14:43:47 发布

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

我有一维向量,我想得到矩形信号的起始和结束位置(在下面的图片中突出显示)。我使用的是python,这个信号是y轴上二值图像中白色像素的直方图。我试着在周围没有噪音的情况下得到物体的ROI。你知道吗

enter image description hereenter image description here


Tags: 图像信号情况图片像素直方图向量物体
1条回答
网友
1楼 · 发布于 2024-05-15 14:43:47

这是一个天真的解决方案,但它的工作。从中间点开始,搜索左右两侧的急剧下降。你知道吗

def get_start_end(projection):
    middle_indx = int(len(projection)/2)
    middle_value = projection[middle_indx]
    print "middle index is = ", middle_indx, " it's value is ", middle_value
    #  search for sharp dropping right (end)
    for i, v in enumerate(projection[middle_indx+1:]):
        diff = int(middle_value) - v
        if(diff > 0.5*middle_value):
            end = i + middle_indx+1
            break

    #  search for sharp dropping left (start)
    for i, v in enumerate(projection[:middle_indx]):
        diff = int(middle_value) - v
        if(diff > 0.5*middle_value):
            start = i
    return start, end

编辑

如果我们没有找到比ratio*middle_value更高的下降,那么就找到最大下降。你知道吗

def get_plate_y_coordinates(projection_vector):
    ratio = 0.5
    middle_indx = int(len(projection_vector)/2)
    middle_value = projection_vector[middle_indx]
    start = 0
    end = len(projection_vector)
    print "middle index is = ", middle_indx, " it's value is ", middle_value

    #  search for sharp dropping right (end)
    saved_diff = []
    for i, v in enumerate(projection_vector[middle_indx+1:]):
        diff = int(middle_value) - v
        if(diff > ratio*middle_value):
            end = i + middle_indx+1
            break
        else:
            saved_diff.append((diff, i + middle_indx+1))

    if (end == len(projection_vector)) and (len(saved_diff)>0): #didn't chage
        saved_diff = np.array(saved_diff)
        sorted_diff = saved_diff[saved_diff[:,0].argsort()[::-1],:]
        end = int(sorted_diff[0,1])

    #  search for sharp dropping left (start)
    saved_diff=[]
    for i, v in enumerate(projection_vector[:middle_indx]):
        diff = int(middle_value) - v
        if(diff > ratio*middle_value):
            start = i
        else:
            saved_diff.append((diff, i))

    if (start == 0) and (len(saved_diff)>0): #didn't chage
        saved_diff = np.array(saved_diff)
        sorted_diff = saved_diff[saved_diff[:,0].argsort()[::-1],:]
        start = int(sorted_diff[0,1])
    return start, end

enter image description hereenter image description here

相关问题 更多 >