在python中跟踪图像

时间:2017-12-21 04:21:47

标签: python numpy opencv image-processing

我写了这个python脚本来跟踪图像。但这是一个错误。它显示“IndexError:索引181超出轴0的大小为181”,其中我的图像大小为 181x158 。为了纠正这个错误,我缩小了范围,但没有用。

import cv2
import numpy as np
global p
a = cv2.imread('t.png',0);
b = (255 -a);
c = np.asarray(b);
p = np.count_nonzero(c)
[ay , ax] = c.shape;
z = np.zeros(c.shape, dtype=np.int)

def startTrace(yt,xt):
    global p
    p = p-1
    z[yt,xt] = 255;
    c[yt,xt] =0;
    if (c[yt, xt+1] > 0):
        startTrace(yt,xt+1)
    elif (c[yt+1,xt+1] > 0):
        startTrace(yt+1,xt+1)
    elif (c[yt+1,xt] > 0):
        startTrace(yt+1,xt)
    elif (c[yt+1,xt-1] >0) :
        startTrace(yt+1,xt-1)
    elif (c[yt,xt-1] >0):
        startTrace(yt,xt-1)
    elif (c[yt-1,xt-1] > 0):
        startTrace(yt-1,xt-1)
    elif (c[yt-1,xt] > 0):
        startTrace(yt-1,xt)
    elif (c[yt-1,xt+1] > 0):
        startTrace(yt-1,xt+1)


while (p > 0):
    for y in range(1,ay-2):
        for x in range(1,ax-2):
            if c[y,x] > 0 :
                startTrace(y,x);

2 个答案:

答案 0 :(得分:1)

请注意,您的代码是递归的(startTrace调用自身),并且您不知道它将调用自身的次数。事实上,你能确保对startTrace()的单个调用将会退出吗? startTrace()可以永远调用startTrace()吗?这最终会导致堆栈溢出。但这不是你的问题(还)。

代码失败,因为每次调用startTrace都有不同的参数(+ 1,-1),而不是对startTrace()的原始调用。即使在“while”内部调用确保你没有超出范围,如果以递归方式调用startTrace(),每个新调用可能会有原始参数+1,最终将增长到超出界限(没有检查)在startTrace()里面,参数在图像的边界内)。你应该在你的函数的开头添加一个if来检查xt是否在图像的边界内。

无论如何,我建议在OpenCV中搜索一个能够做你想要的方法。例如,看看findContours。

答案 1 :(得分:0)

感谢大家的帮助。 此代码工作正常。

import cv2
import numpy as np


global p
a = cv2.imread('t.png',0);
[ty,tx] = a.shape;
o = np.zeros((ty+2,tx+2),dtype=np.int)
o[1:ty+1,1:tx+1] = (255 -a);
c = np.asarray(o);
p = np.count_nonzero(c)
[ay , ax] = c.shape;
z = np.zeros(c.shape, dtype=np.int)

def startTrace(yt,xt):
    global p
    cv2.imshow('image',z);
    z[yt,xt] = 255;
    c[yt,xt] =0;
    p = np.count_nonzero(c)
    if((yt < ay-1) and (xt < ax -1)): 
        if (c[yt, xt+1] > 0):
            startTrace(yt,xt+1)
        elif (c[yt+1,xt+1] > 0):
            startTrace(yt+1,xt+1)
        elif (c[yt+1,xt] > 0):
            startTrace(yt+1,xt)
        elif (c[yt+1,xt-1] >0) :
            startTrace(yt+1,xt-1)
        elif (c[yt,xt-1] >0):
            startTrace(yt,xt-1)
        elif (c[yt-1,xt-1] > 0):
            startTrace(yt-1,xt-1)
        elif (c[yt-1,xt] > 0):
            startTrace(yt-1,xt)
        elif (c[yt-1,xt+1] > 0):
            startTrace(yt-1,xt+1)


while (p > 0):
    for y in range(1,ay-2):
        for x in range(1,ax-2):
            if (c[y,x] > 0) :
                startTrace(y,x);