【问题标题】:Counting the no. of black to white pixels in the image using OpenCV数着数。使用 OpenCV 将图像中的黑白像素
【发布时间】:2018-11-21 20:49:22
【问题描述】:

我是 python 新手,非常感谢任何帮助。

我试图从这张图片中做的是计算黑色像素的数量 (0,0,0) 和连续值,即 (1,1,1), (2,2,2), ( 3,3,3) 到 (255,255,255)。所以代码会打印出答案,例如:

(0,0,0) = 10 pixels
(1,1,1) = 5 pixels
(2,2,2) = 8 pixels
etc.

这是我在网上找到的用于查找蓝色像素的代码,但我不想设置上下边界。我完全不知道如何做到这一点,请帮忙!

import cv2
import numpy as np

img = cv2.imread("multi.png")
BLUE_MIN = np.array([0, 0, 200], np.uint8)
BLUE_MAX = np.array([50, 50, 255], np.uint8)

dst = cv2.inRange(img, BLUE_MIN, BLUE_MAX)
no_blue = cv2.countNonZero(dst)
print('The number of blue pixels is: ' + str(no_blue))
cv2.namedWindow("opencv")
cv2.imshow("opencv",img)
cv2.waitKey(0)

【问题讨论】:

    标签: python numpy opencv image-processing


    【解决方案1】:
    import cv2
    import numpy as np
    from collections import defaultdict
    
    img = cv2.imread("C:\\temp\\multi.png")
    pixels = img.reshape(-1,3)
    
    counts = defaultdict(int)
    for pixel in pixels:
        if pixel[0] == pixel[1] == pixel[2]:
            counts[pixel[0]] += 1
    
    for pv in sorted(counts.keys()):
        print("(%d,%d,%d): %d pixels" % (pv, pv, pv, counts[pv]))
    

    打印:

    (3,3,3):7477 像素 (6,6,6):5343 像素 (8,8,8):4790 像素 (11,11,11):4290 像素 (13,13,13):3681 像素 (16,16,16):3605 像素 (19,19,19):2742 像素 (21,21,21):2984 像素 (26,26,26):2366 像素 (29,29,29):2149 像素 (32,32,32):2460 像素 ...

    【讨论】:

      【解决方案2】:

      使用void 视图和np.unique

      def vview(a):  #based on @jaime's answer: https://stackoverflow.com/a/16973510/4427777
          return np.ascontiguousarray(a).view(np.dtype((np.void, a.dtype.itemsize * a.shape[1])))
      
      pixels = = img.reshape(-1,3)
      _, idx, count = np.unique(vview(pixels), return_index = True, return_counts = True)
      
      print np.c_[pixels[idx], count[:, None]]
      

      基本上pixels[idx] 是所有唯一像素的数组,count 是图像中每个像素的数量

      【讨论】:

        【解决方案3】:
        colors, counts = np.unique(img.reshape(-1, 3), axis=0, return_counts=True)
        
        for color, count in zip(colors, counts):
            print("{} = {} pixels".format(color, count))
        
        [1 1 0] = 6977 pixels
        [3 3 3] = 7477 pixels
        [6 6 6] = 5343 pixels
        [8 8 8] = 4790 pixels
        [11 11 11] = 4290 pixels
        [13 13 13] = 3681 pixels
        [16 16 16] = 3605 pixels
        [19 19 19] = 2742 pixels
        [21 21 21] = 2984 pixels
        [...]
        

        【讨论】:

        • doh。我忘了他们用axis 参数更新了np.unique,所以你不再需要void 视图破解了。
        • @DanielF 似乎仍然是一个不错的技巧,但不知道!不确定是否真的需要它,大多数np 函数现在都具有axis 参数
        猜你喜欢
        • 1970-01-01
        • 2011-11-29
        • 2011-09-29
        • 1970-01-01
        • 1970-01-01
        • 2013-06-23
        • 2022-12-15
        • 1970-01-01
        • 2015-05-05
        相关资源
        最近更新 更多