python - 使用 Python 和 Numpy 将 RGB 图像与自定义邻居内核进行卷积

标签 python image numpy scipy

我正在尝试实现一种算法来验证 RGB 图像的 4 个相邻像素(上、下、左和右),如果所有像素 RGB 值都相等,我将输出图像中的一个像素标记为 1,否则它将为 0。非矢量化实现是:

def set_border_interior(img):
  img_rows = img.shape[0]
  img_cols = img.shape[1]
  res = np.zeros((img_rows,img_cols))
  for row in xrange(1,img_rows-1):
      for col in xrange(1,img_cols-1):
          data_b = set()
          data_g = set()
          data_r = set()
          up = row - 1
          down = row + 1
          left = col - 1
          right = col + 1

          data_b.add(img.item(row,col,0))
          data_g.add(img.item(row,col,1))
          data_r.add(img.item(row,col,2))

          data_b.add(img.item(up,col,0))
          data_g.add(img.item(up,col,1))
          data_r.add(img.item(up,col,2))

          data_b.add(img.item(down,col,0))
          data_g.add(img.item(down,col,1))
          data_r.add(img.item(down,col,2))

          data_b.add(img.item(row,left,0))
          data_g.add(img.item(row,left,1))
          data_r.add(img.item(row,left,2))

          data_b.add(img.item(row,right,0))
          data_g.add(img.item(row,right,1))
          data_r.add(img.item(row,right,2))

          if (len(data_b) == 1) and (len(data_g) == 1) and (len(data_r) == 1):
              res.itemset(row,col, False)
          else:
              res.itemset(row,col, True)
  return res

这种非矢量化的方式,但它确实很慢(即使使用 img.item 读取数据和 img.itemset 设置新值)。有没有更好的方法在 Numpy(或 scipy)中实现它?

最佳答案

撇开边界,无论如何你的函数都没有很好地定义,你可以执行以下操作:

import numpy as np
import matplotlib.pyplot as plt

rows, cols = 480, 640
rgb_img = np.zeros((rows, cols, 3), dtype=np.uint8)

rgb_img[:rows//2, :cols//2] = 255

center_slice = rgb_img[1:-1, 1:-1]
left_slice = rgb_img[1:-1, :-2]
right_slice = rgb_img[1:-1, 2:]
up_slice = rgb_img[:-2, 1:-1]
down_slice = rgb_img[2:, 1:-1]

all_equal = (np.all(center_slice == left_slice, axis=-1) &
             np.all(center_slice == right_slice, axis=-1) &
             np.all(center_slice == up_slice, axis=-1) &
             np.all(center_slice == down_slice, axis=-1))

plt.subplot(211)
plt.imshow(rgb_img, interpolation='nearest')
plt.subplot(212)
plt.imshow(all_equal, interpolation='nearest')
plt.show()

enter image description here

关于python - 使用 Python 和 Numpy 将 RGB 图像与自定义邻居内核进行卷积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18922604/

相关文章:

python - 生成多个 Pandas 数据框

java - 我试图通过 spring 框架将图像路径存储在 mysql 数据库中...但无法做到这一点.. :/

python - 使用索引数组索引多维 Numpy 数组

python - 调整 PIL 像素值的更快方法

python - 如何修复 Snowflake 数据库写入错误 : snowflake. Connector.errors.ProgrammingError) 001003 (42000)

python - 如何将一个有序列表中的每个对象插入到另一个嵌套列表中?

image - 如何检测区域上方和下方的点?

javascript - 背景图像

python - 如何加速 numpy.all 和 numpy.nonzero()?

python - argparse:传递负值时需要一个参数