【问题标题】:Searching for a pixel in an image using opencv, numpy and python使用 opencv、numpy 和 python 在图像中搜索像素
【发布时间】:2020-03-31 23:12:45
【问题描述】:

我已经能够读取图像,然后使用可以正常工作的坐标位置读取特定像素 (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")

【问题讨论】:

    标签: python numpy opencv


    【解决方案1】:

    内置的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 中的 for 循环很慢,并且代码需要一段时间才能在适当大的图像上运行。相反,最好使用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!
    【解决方案2】:

    我认为您遇到的主要问题是您需要定义图像的 width 和 height,这样您就知道需要在 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))
    

    【讨论】:

      【解决方案3】:

      您的语句if x.sort ==pixel.sort 正在测试x 对象上的sort 方法是否与pixel.sort 函数相等(引用相等)。这些永远不会相等,因为它们位于不同的对象上。我不完全确定您为什么要使用 sort 方法来测试相等性。您应该能够检查if (x == pixel).all() 并获得您要查找的内容。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-08-25
        • 1970-01-01
        • 1970-01-01
        • 2023-04-08
        • 1970-01-01
        • 1970-01-01
        • 2019-06-15
        • 1970-01-01
        相关资源
        最近更新 更多