python - 沿颜色边框裁剪图像的方法?
问题描述
应将诸如此 ( https://imgur.com/a/1B7nQnk ) 之类的图像裁剪为单个单元格。遗憾的是,垂直距离不是静态的,因此需要应用更复杂的方法。由于单元格具有交替的背景颜色(灰色和白色,可能在低对比度显示器上不可见),我认为可以获得白色和灰色之间边界的坐标,从而可以完成准确的裁剪。有没有办法,例如,将图像转换成一个巨大的二维数组,数字对应于像素的颜色?......所以基本上:
还是有其他方法?
解决方案
这是一个片段,展示了如何访问图像的各个像素。为简单起见,它首先将图像转换为灰度,然后打印出每行的前三个像素。它还指示第一个像素的亮度与前一行该列中的那个像素的不同之处——您可以使用它来检测垂直边界。
你可以在右侧做类似的事情来确定边界在哪里(你已经确定了垂直边界)。
from PIL import Image
IMAGE_FILENAME = 'cells.png'
WHITE = 255
img = Image.open(IMAGE_FILENAME).convert('L') # convert image to 8-bit grayscale
WIDTH, HEIGHT = img.size
data = list(img.getdata()) # convert image data to a list of integers
# convert that to a 2D list (list of lists of integers)
data = [data[offset:offset+WIDTH] for offset in range(0, WIDTH*HEIGHT, WIDTH)]
prev_pixel = WHITE
for i, row in enumerate(range(HEIGHT)):
possible_boundary = ' boundary?' if data[row][0] != prev_pixel else ''
print(f'row {i:5,d}: {data[row][:3]}{possible_boundary}')
prev_pixel = data[row][0]
推荐阅读
- multithreading - 运行时线程访问冲突错误
- javascript - 实时拖放移动
- excel - 为什么循环在第一次成功查找时终止?
- similarity - 为电视节目的用户评分选择相似性度量
- loops - 在 terraform 中映射所有现有的 aws 安全组
- c# - 如何在 WPF 应用程序中更新 DataContext?
- arrays - 如何正确使用 is_single 隐藏我的数组?
- java - 如何从 install4j 中的脚本访问 sys.preferredJre?
- excel - Loc 函数在 pandas 中不起作用(我的 df.loc 命令不起作用)
- python - Django 的 queryset.aggregate max() 在 9 之后遇到问题