使用python从二进制图像中裁剪感兴趣区域
Posted
技术标签:
【中文标题】使用python从二进制图像中裁剪感兴趣区域【英文标题】:Crop region of interest from binary image using python 【发布时间】:2019-02-24 14:58:23 【问题描述】:要求是从二值图像中裁剪感兴趣的区域。
我需要通过删除感兴趣区域周围的额外空间来从二进制图像中获取矩形图像。
例如: 从这张Original 图像中,我只想要标有黄色矩形的region of interest。
注意:黄色矩形仅供参考,它不存在于将要处理的图像中。
我尝试了以下 python 代码,但它没有提供所需的输出。
from PIL import Image
from skimage.io import imread
from skimage.morphology import convex_hull_image
import numpy as np
from matplotlib import pyplot as plt
from skimage import io
from skimage.color import rgb2gray
im = imread('binaryImageEdited.png')
plt.imshow(im)
plt.title('input image')
plt.show()
# create a binary image
im1 = 1 - rgb2gray(im)
threshold = 0.8
im1[im1 <= threshold] = 0
im1[im1 > threshold] = 1
chull = convex_hull_image(im1)
plt.imshow(chull)
plt.title('convex hull in the binary image')
plt.show()
imageBox = Image.fromarray((chull*255).astype(np.uint8)).getbbox()
cropped = Image.fromarray(im).crop(imageBox)
cropped.save('L_2d_cropped.png')
plt.imshow(cropped)
plt.show()
谢谢。
【问题讨论】:
我的回答解决了你的问题吗?如果是这样,请考虑接受它作为您的答案 - 通过单击计票旁边的空心对勾/复选标记。如果没有,请说出什么不起作用,以便我或其他人可以进一步为您提供帮助。谢谢。 meta.stackexchange.com/questions/5234/… 【参考方案1】:由于两件事,您的图像实际上不是二进制的:
首先,它有 26 种颜色,并且 其次,它有一个(完全没有必要的)Alpha 通道。你可以这样修剪它:
#!/usr/bin/env python3
from PIL import Image, ImageOps
# Open image and ensure greysale and discard useless alpha channel
im = Image.open("thing.png").convert('L')
# Threshold and invert image as not actually binary
thresh = im.point(lambda p: p < 64 and 255)
# Get bounding box of thresholded image
bbox1 = thresh.getbbox()
crop1 = thresh.crop(bbox1)
# Invert and crop again
crop1n = ImageOps.invert(crop1)
bbox2 = crop1n.getbbox()
crop2 = crop1.crop(bbox2) # You don't actually need this - it's just for debug
# Trim original, unthresholded, uninverted image to the two bounding boxes
result = im.crop(bbox1).crop(bbox2)
result.save('result.png')
【讨论】:
【参考方案2】:即使我也有类似的问题。如果保存的图像为 32X32 像素,也会很有帮助。
【讨论】:
为什么会有帮助?以上是关于使用python从二进制图像中裁剪感兴趣区域的主要内容,如果未能解决你的问题,请参考以下文章