【问题标题】:Finding boundary pixels with Opencv without for loop使用没有 for 循环的 Opencv 查找边界像素
【发布时间】:2020-06-27 05:28:28
【问题描述】:

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

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):
        Xc.append(cr_w)
        Yc.append(cr_h)

这就是我在没有 for 循环的情况下尝试做的事情,这给了我错误'具有多个元素的数组的真值是模棱两可的。使用 a.any() 或 a.all()。'

cr_h=PCR[:,0]
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]
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):
    Xc.append(cr_w)
    Yc.append(cr_h)

【问题讨论】:

  • 将示例图像发布到一些免费托管服务并放置 URL。然后定义边界像素!

标签: python image opencv processing pixel


【解决方案1】:

您可以使用np.logical_ornp.logical_and 以及如下逻辑索引:

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_cap_copy 只有一和零,您可以使用数学而不是逻辑运算,但使用np.logical_ornp.logical_and 更接近您的原始循环代码。

【讨论】:

  • 非常感谢。关于使用数学而不是逻辑运算,请您告诉我 img_cap_copy 仅包含 1 和 0 是如何正确的。
  • 您可以使用二进制和andor 例如: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
猜你喜欢
  • 1970-01-01
  • 2016-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-24
  • 2013-02-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多