Поиск пикселя в изображении с использованием opencv, numpy и python - PullRequest
2 голосов
/ 01 апреля 2020

Я смог прочитать изображение, а затем прочитать определенный c пиксель, используя координату, которая работает нормально (pixel = img[801,600]).

Мой следующий шаг - перебрать каждый пиксель и попытаться найти местоположение (в этом примере [801 600]) с использованием данных пикселя.

Моя итерация по «img» не может найти пиксель. Буду признателен за любую помощь или руководство.

import cv2
import numpy as np

img = cv2.imread('one.jpg')

pixel = img[801,600]

print (pixel) # pixel value i am searching for

for i in img:
    for x in i:
        if x.sort == pixel.sort:
            print ("SUCCESS")

Ответы [ 3 ]

5 голосов
/ 01 апреля 2020

Встроенная функция итерации enumerate поможет вам. Он предоставит индекс итерации, который в вашем случае предоставит индекс пикселя:

import cv2
import numpy as np

img = cv2.imread('one.jpg')

pixel = img[801,600]
print (pixel) # pixel value i am searching for

def search_for():
    for iidx, i in enumerate(img):
        for xidx, x in enumerate(i):
            if (x == pixel).all():
                print (f"SUCCESS - [{iidx} {xidx}]")

if __name__ == "__main__":
    print("Search using for loops...")
    search_for()

При этом циклы медленны в python, и для запуска кода требуется некоторое время достаточно большое изображение. Вместо этого предпочтительнее использовать np.array методы, так как они оптимизированы для этого типа приложений:

import cv2
import numpy as np

img = cv2.imread('one.jpg')

pixel = img[801,600]
print (pixel) # pixel value i am searching for

def search_array():
    # create an image of just the pixel, having the same size of 
    pixel_tile = np.tile(pixel, (*img.shape[:2], 1))
    # absolute difference of the two images
    diff = np.sum(np.abs(img - pixel_tile), axis=2)
    # print indices
    print("\n".join([f"SUCCESS - {idx}" for idx in np.argwhere(diff == 0)]))


if __name__ == "__main__":
    print("Search using numpy methods...")
    search_array()
0 голосов
/ 01 апреля 2020

Ваше утверждение if x.sort ==pixel.sort проверяет, равен ли метод sort для объекта x (ссылочное равенство) функции pixel.sort. Они никогда не будут равны, потому что они на разных объектах. Я не совсем уверен, почему вы используете метод sort для проверки равенства. Вы должны иметь возможность просто проверить if (x == pixel).all() и получить то, что ищете.

0 голосов
/ 01 апреля 2020

Я думаю, что основная проблема, с которой вы столкнулись, заключается в том, что вам нужно определить width и height вашего изображения, чтобы вы знали, сколько пикселей в направлении x и y вам нужно, чтобы l oop

# grab the image dimensions
h = img.shape[0]
w = img.shape[1]
point_found_at = []

# loop over the image, pixel by pixel
for y in range(0, h):
    for x in range(0, w):
        if (x == 801) and (y == 600):
            print ("SUCCESS")
            point_found_at.append((x, y))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...