Udało mi się odczytać obraz, a następnie odczytać określony piksel przy użyciu współrzędnej lokalizacji, która działa dobrze (pixel = img[801,600]).

Mój następny krok to iteracja przez każdy piksel i próba znalezienia lokalizacji (w tym przykładzie [801,600]) przy użyciu danych pikseli.

Moja iteracja przez „img” nie jest w stanie znaleźć piksela. Byłbym wdzięczny za każdą pomoc lub wskazówki.

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")
2
JohnPaul 1 kwiecień 2020, 02:12

3 odpowiedzi

Najlepsza odpowiedź

Pomoże Ci w tym wbudowana funkcja iteracji enumerate. Zapewni indeks iteracji, który w twoim przypadku zapewni indeks pikseli:

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()

Mając to na uwadze, pętle for są powolne w Pythonie i potrzeba trochę czasu, zanim kod zostanie uruchomiony na odpowiednio dużym obrazie. Zamiast tego preferowane jest używanie metod np.array, ponieważ są one zoptymalizowane pod kątem tego typu aplikacji:

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()
5
DBat 31 marzec 2020, 23:47

Myślę, że głównym problemem, który masz, jest to, że musisz zdefiniować width i height obrazu, aby wiedzieć, ile pikseli w kierunku xiy musisz zapętlić

# 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))
0
Rishabh Jain 31 marzec 2020, 23:46

Twoja instrukcja if x.sort ==pixel.sort sprawdza, czy metoda sort obiektu x jest równa (równość referencyjna) funkcji pixel.sort. Te nigdy nie będą równe, ponieważ znajdują się na różnych obiektach. Nie jestem do końca pewien, dlaczego używasz metody sort do testowania równości. Powinieneś być w stanie po prostu sprawdzić if (x == pixel).all() i znaleźć to, czego szukasz.

0
jkoeller 31 marzec 2020, 23:49