Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用Opencv查找不带for循环的边界像素_Python_Image_Opencv_Processing_Pixel - Fatal编程技术网

Python 使用Opencv查找不带for循环的边界像素

Python 使用Opencv查找不带for循环的边界像素,python,image,opencv,processing,pixel,Python,Image,Opencv,Processing,Pixel,我试图在不使用for循环的情况下,从二值图像中找到前景对象的边界像素。如果特定像素坐标的四个相邻像素中的任何一个为零,并且该像素值为1,则我将其指定为边界像素。它可以很好地用于for循环,但我不想使用循环,所以我可以用它做些什么。代码如下: 适用于范围内的i(len(PCR)): cr_h=PCR[i,0] cr_w=PCR[i,1] n1=img\U cap\U副本[cr\U h-1,cr\U w] n2=img\U cap\U副本[cr\U h+1,cr\U w] n3=img_cap_副本

我试图在不使用for循环的情况下,从二值图像中找到前景对象的边界像素。如果特定像素坐标的四个相邻像素中的任何一个为零,并且该像素值为1,则我将其指定为边界像素。它可以很好地用于for循环,但我不想使用循环,所以我可以用它做些什么。代码如下:

适用于范围内的i(len(PCR)):
cr_h=PCR[i,0]
cr_w=PCR[i,1]
n1=img\U cap\U副本[cr\U h-1,cr\U w]
n2=img\U cap\U副本[cr\U h+1,cr\U w]
n3=img_cap_副本[cr_h,cr_w-1]
n4=img_cap_副本[cr_h,cr_w+1]
n=[n1,n2,n3,n4]
如果img_cap_copy[cr_h,cr_w]==1和(n[0]==0或n[1]==0或n[2]==0或n[3]==0):
Xc.附加(cr\U w)
Yc.附加(cr_h)
这就是我尝试在没有for循环的情况下所做的,for循环给了我一个错误:一个包含多个元素的数组的真值是不明确的。使用a.any()或a.all()

cr_h=PCR[:,0]
cr_h=PCR[:,0]
n1=img\U cap\U副本[cr\U h-1,cr\U w]
n2=img\U cap\U副本[cr\U h+1,cr\U w]
n3=img_cap_副本[cr_h,cr_w-1]
n4=img_cap_副本[cr_h,cr_w+1]
n=[n1,n2,n3,n4]
如果img_cap_copy[cr_h,cr_w]==1和(n[0]==0或n[1]==0或n[2]==0或n[3]==0):
Xc.附加(cr\U w)
Yc.附加(cr_h)

您可以使用
np.logical\u或
np.logical\u和
和逻辑索引,如下所示:

cr_h=PCR[:,0]
cr_w=PCR[:,1] #cr_h=PCR[:,0]
n1 = img_cap_copy[cr_h-1,cr_w]
n2 = img_cap_copy[cr_h+1,cr_w]
n3 = img_cap_copy[cr_h,cr_w-1]
n4 = img_cap_copy[cr_h,cr_w+1]

# Logical array with True where condition is met
c = np.logical_and(img_cap_copy[cr_h,cr_w]==1, np.logical_or(np.logical_or(np.logical_or(n1==0, n2==0), n3==0), n4==0))

# Use logical indexing - return elements when c is True.
Xc = cr_w[c].tolist()
Yc = cr_h[c].tolist()

测试代码:

import cv2
import numpy as np

# Build sample image
img = np.random.randint(0, 255, (120, 160), np.uint8)
img_cap_copy = np.minimum(cv2.threshold(img, 50, 255, cv2.THRESH_BINARY)[1], 1)

# Build sample PRC
PCR = np.vstack((np.r_[1:1001], np.r_[10:1010])).T % 100

# Used as reference
refXc = []
refYc = []

for i in range(len(PCR)):
    cr_h = PCR[i,0]
    cr_w = PCR[i,1]
    n1 = img_cap_copy[cr_h-1,cr_w]
    n2 = img_cap_copy[cr_h+1,cr_w]
    n3 = img_cap_copy[cr_h,cr_w-1]
    n4 = img_cap_copy[cr_h,cr_w+1]
    n=[n1,n2,n3,n4]
    if img_cap_copy[cr_h,cr_w]==1 and (n[0]==0 or n[1]==0 or n[2]==0 or n[3]==0):
        refXc.append(cr_w)
        refYc.append(cr_h)


cr_h=PCR[:,0]
cr_w=PCR[:,1] #cr_h=PCR[:,0]
n1 = img_cap_copy[cr_h-1,cr_w]
n2 = img_cap_copy[cr_h+1,cr_w]
n3 = img_cap_copy[cr_h,cr_w-1]
n4 = img_cap_copy[cr_h,cr_w+1]

# Logical array with True where condition is met
c = np.logical_and(img_cap_copy[cr_h,cr_w]==1, np.logical_or(np.logical_or(np.logical_or(n1==0, n2==0), n3==0), n4==0))

# Use logical indexing - return elements when c is True.
Xc = cr_w[c].tolist()
Yc = cr_h[c].tolist()

print(str(np.all(np.array(Xc) == np.array(refXc))))
print(str(np.all(np.array(Yc) == np.array(refYc))))

注:

  • 如果
    img\u cap\u copy
    只有1和0,您可以使用数学而不是逻辑运算,但是使用
    np。logical\u或
    np。logical\u和
    更接近原始循环代码
    
您可以使用
np.logical\u或
np.logical\u和
和逻辑索引,如下所示:

cr_h=PCR[:,0]
cr_w=PCR[:,1] #cr_h=PCR[:,0]
n1 = img_cap_copy[cr_h-1,cr_w]
n2 = img_cap_copy[cr_h+1,cr_w]
n3 = img_cap_copy[cr_h,cr_w-1]
n4 = img_cap_copy[cr_h,cr_w+1]

# Logical array with True where condition is met
c = np.logical_and(img_cap_copy[cr_h,cr_w]==1, np.logical_or(np.logical_or(np.logical_or(n1==0, n2==0), n3==0), n4==0))

# Use logical indexing - return elements when c is True.
Xc = cr_w[c].tolist()
Yc = cr_h[c].tolist()

测试代码:

import cv2
import numpy as np

# Build sample image
img = np.random.randint(0, 255, (120, 160), np.uint8)
img_cap_copy = np.minimum(cv2.threshold(img, 50, 255, cv2.THRESH_BINARY)[1], 1)

# Build sample PRC
PCR = np.vstack((np.r_[1:1001], np.r_[10:1010])).T % 100

# Used as reference
refXc = []
refYc = []

for i in range(len(PCR)):
    cr_h = PCR[i,0]
    cr_w = PCR[i,1]
    n1 = img_cap_copy[cr_h-1,cr_w]
    n2 = img_cap_copy[cr_h+1,cr_w]
    n3 = img_cap_copy[cr_h,cr_w-1]
    n4 = img_cap_copy[cr_h,cr_w+1]
    n=[n1,n2,n3,n4]
    if img_cap_copy[cr_h,cr_w]==1 and (n[0]==0 or n[1]==0 or n[2]==0 or n[3]==0):
        refXc.append(cr_w)
        refYc.append(cr_h)


cr_h=PCR[:,0]
cr_w=PCR[:,1] #cr_h=PCR[:,0]
n1 = img_cap_copy[cr_h-1,cr_w]
n2 = img_cap_copy[cr_h+1,cr_w]
n3 = img_cap_copy[cr_h,cr_w-1]
n4 = img_cap_copy[cr_h,cr_w+1]

# Logical array with True where condition is met
c = np.logical_and(img_cap_copy[cr_h,cr_w]==1, np.logical_or(np.logical_or(np.logical_or(n1==0, n2==0), n3==0), n4==0))

# Use logical indexing - return elements when c is True.
Xc = cr_w[c].tolist()
Yc = cr_h[c].tolist()

print(str(np.all(np.array(Xc) == np.array(refXc))))
print(str(np.all(np.array(Yc) == np.array(refYc))))

注:

  • 如果
    img\u cap\u copy
    只有1和0,您可以使用数学而不是逻辑运算,但是使用
    np。logical\u或
    np。logical\u和
    更接近原始循环代码
    
将一个示例图像发布到某个免费托管服务上,并放置URL。然后定义边界像素!将一个示例图像发布到某个免费托管服务,并放置URL。然后定义边界像素!非常感谢你。关于使用数学而不是逻辑运算,你能告诉我img_cap_copy只包含一和零是怎么回事吗?你可以使用二进制和
例如:
c=(img_cap_copy[cr_h,cr_w]&((n1&n2&n3&n4)^1)!=0
。或者乘法和减法:
c=(img_cap_copy[cr_h,cr_w]*(1-(n1*n2*n3*n4))!=0
非常感谢。关于使用数学而不是逻辑运算,你能告诉我img_cap_copy只包含一和零是怎么回事吗?你可以使用二进制和
例如:
c=(img_cap_copy[cr_h,cr_w]&((n1&n2&n3&n4)^1)!=0
。或者乘法和减法:
c=(img_cap_copy[cr_h,cr_w]*(1-(n1*n2*n3*n4))!=0