Нахождение граничных пикселей с помощью Opencv без цикла for - PullRequest
1 голос
/ 16 марта 2020

Я пытаюсь найти граничные пиксели объекта переднего плана из двоичного изображения, не используя для l oop. Если кто-либо из четырех соседей указанной пиксельной координаты c равен нулю, а значение этого пикселя равно единице, я назначу его в качестве граничного пикселя. Он отлично работает с l oop, но я не хочу использовать al oop, так что я могу с этим что-нибудь сделать. Вот код:

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)

Это то, без чего я пытаюсь обойтись для l oop, что приводит к ошибке. Истинное значение массива с более чем одним элементом неоднозначно. Используйте 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)

1 Ответ

0 голосов
/ 17 марта 2020

Вы можете использовать np.logical_or и np.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_or и np.logical_and ближе к вашему исходному коду l oop.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...