使用opencv、numpy和python在图像中查找像素

3

我已能读取图像并使用坐标位置读取特定像素( 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
内置的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()

尽管如此,对于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()

看起来我需要对numpy方法进行一些研究和学习。非常感谢您的帮助。非常感谢你,DBat! - JohnPaul

0

我认为你面临的主要问题是需要定义图像的宽度高度,以便你知道在x和y方向上需要循环的像素数量。

# 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

你的语句 if x.sort == pixel.sort 是在测试对象 x 上的 sort 方法是否等于(引用相等)pixel.sort 函数。它们永远不会相等,因为它们在不同的对象上。我不确定你为什么要使用 sort 方法来测试相等性。你应该只需要检查 if (x == pixel).all() 就可以得到你想要的结果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接