代码之家  ›  专栏  ›  技术社区  ›  sazr

模式计算不正确或者这是盐和胡椒?

  •  1
  • sazr  · 技术社区  · 8 年前

    我有一个非常简单的用例,我正在网格化一个图像并计算每个单元格中最常出现的颜色。

    enter image description here

    我有个问题,某些细胞 先列后行的零基索引

    def mode_filter(self, roi):
        values = np.zeros((1, 256), dtype="uint8")
    
        for pos, val in np.ndenumerate(roi):
            values[0, val] += 1
    
        print(values)
        return int(np.argmax(values[0]))
    
    def get_roi(self, src, pt1, pt2):
    
        col1, col2 = (pt1[0], pt2[0]) if pt1[0] < pt2[0] else (pt2[0], pt1[0])
        row1, row2 = (pt1[1], pt2[1]) if pt1[1] < pt2[1] else (pt2[1], pt1[1])
        return src[row1:row2, col1:col2]
    
    def grid_img(self, src, nCols=7, nRows=7):
    
        gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)
        cells = np.zeros(gray.shape, dtype="uint8")
        cell_w = int(gray.shape[1] / nCols)
        cell_h = int(gray.shape[0] / nRows)
    
        for c in range(nCols): 
            for r in range(nRows):
                roi = self.get_roi(gray, (c*cell_w, r*cell_h), ((c+1)*cell_w, (r+1)*cell_h))
    
                mode = self.mode_filter(roi)
                cv2.rectangle(cells, (c*cell_w, r*cell_h), ((c+1)*cell_w, (r+1)*cell_h), (mode,), -1)
    
                cv2.imshow('roi', roi)
                cv2.imshow('cells', cells)
                cv2.imshow('src', src)
                print('{}, {}'.format((c,r), mode))
                cv2.waitKey(0)
    
        return cells
    

    完整的工作示例如下: https://pastebin.com/k7kUTmXG

    enter image description here

    1 回复  |  直到 8 年前
        1
  •  3
  •   Dan MaÅ¡ek    8 年前

    用于计算每种颜色出现次数的数组定义如下:

    values = np.zeros((1, 256), dtype="uint8")
    

    这意味着每个计数用一个字节来表示,这意味着最大值是255。一旦该颜色的额外像素出现,计数将溢出到0。

    这几乎是肯定会发生的,因为您正在处理的ROI大小约为100x100像素。

    解决方案很简单——使用更大的数据类型,例如 int32

    def mode_filter(self, roi):
        values = np.zeros((1, 256), dtype="int32")
    
        for pos, val in np.ndenumerate(roi):
            values[0, val] += 1
    
        print(values)
        return int(np.argmax(values[0]))
    

    例如,在平铺(0,5)上,如下所示:

    Tile (0,5)

    [[144  15   9  13   8   1   5   9   4   5   5   1   2   4   4   4   4   6
        7   5   4   2   1   2   1   1   0   1   2   1   6   3   4   7   2   3
        1   1   2   1   0   4   2   2   3   2   0   2   0   2   0   1   2   5
        1   3   2   4   2   2   3   3   1   3   4   2   2   2   2   4   3   2
        4   0   1   2   0   2   2   2   1   0   2   2   1   1   2   1   0   3
        2   0   1   1   0   4   1   3   1   2   3   1   0   3   0   1   1   0
        0   1   2   1   2   0   1   2   2   1   1   0   1   2   2   4   2   1
        2   1   1   1   1   2   1   1   1   3   1   1   2   3   2   1   2   0
        1   1   1   3   4   2   3   1   1   2   1   1   5   3   1   2   1   1
        1   0   2   3   0   1   1   3   4   0   2   1   4   3   0   1   4   1
        1   2   2   1   0   1   1   2   1   1   1   3   2   3   1   5   0   2
        2   1   2   2   0   2   1   0   1   1   4   2   4   2   2   4   1   4
        4   4   1   3   1   0   3   6   3   2   0   2   3   5   3   3   5   5
        5   4   3   6   7   4   1   7   2  10   5  10   6  10   7   7  16   8
       10  14  16 125]]
    0
    

    鉴于修正后的版本:

    [[2960   15    9   13    8    1    5    9    4    5    5    1    2    4
         4    4    4    6    7    5    4    2    1    2    1    1    0    1
         2    1    6    3    4    7    2    3    1    1    2    1    0    4
         2    2    3    2    0    2    0    2    0    1    2    5    1    3
         2    4    2    2    3    3    1    3    4    2    2    2    2    4
         3    2    4    0    1    2    0    2    2    2    1    0    2    2
         1    1    2    1    0    3    2    0    1    1    0    4    1    3
         1    2    3    1    0    3    0    1    1    0    0    1    2    1
         2    0    1    2    2    1    1    0    1    2    2    4    2    1
         2    1    1    1    1    2    1    1    1    3    1    1    2    3
         2    1    2    0    1    1    1    3    4    2    3    1    1    2
         1    1    5    3    1    2    1    1    1    0    2    3    0    1
         1    3    4    0    2    1    4    3    0    1    4    1    1    2
         2    1    0    1    1    2    1    1    1    3    2    3    1    5
         0    2    2    1    2    2    0    2    1    0    1    1    4    2
         4    2    2    4    1    4    4    4    1    3    1    0    3    6
         3    2    0    2    3    5    3    3    5    5    5    4    3    6
         7    4    1    7    2   10    5   10    6   10    7    7   16    8
        10   14   16 7293]]
    255