我认为这应该是一个非常简单的问题,但我找不到一个解决方案或有效的关键字搜索。
我只有这张图片。

黑边是无用的,所以我想把它们剪掉,只留下Windows图标(和蓝色背景)。
我不想计算Windows图标的坐标和大小。GIMP和Photoshop具有某种自动裁剪功能。OpenCV没有吗?
发布于 2012-11-24 15:17:51
我不确定你所有的图片都是这样的。但是对于这张图片,下面是一个简单的python-opencv代码来裁剪它。
第一个导入库:
import cv2
import numpy as np读取图像,将其转换为灰度,并将阈值设为1的二值图像。
img = cv2.imread('sofwin.png')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
_,thresh = cv2.threshold(gray,1,255,cv2.THRESH_BINARY)现在找到其中的轮廓。只有一个对象,所以找到它的边界矩形。
contours,hierarchy = cv2.findContours(thresh,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
cnt = contours[0]
x,y,w,h = cv2.boundingRect(cnt)现在裁剪图像,并将其保存到另一个文件中。
crop = img[y:y+h,x:x+w]
cv2.imwrite('sofwinres.png',crop)结果如下:

发布于 2015-05-30 06:59:45
import numpy as np
def autocrop(image, threshold=0):
"""Crops any edges below or equal to threshold
Crops blank image to 1x1.
Returns cropped image.
"""
if len(image.shape) == 3:
flatImage = np.max(image, 2)
else:
flatImage = image
assert len(flatImage.shape) == 2
rows = np.where(np.max(flatImage, 0) > threshold)[0]
if rows.size:
cols = np.where(np.max(flatImage, 1) > threshold)[0]
image = image[cols[0]: cols[-1] + 1, rows[0]: rows[-1] + 1]
else:
image = image[:1, :1]
return image发布于 2019-12-06 14:55:57
我认为这个答案要简洁得多:
def crop(image):
y_nonzero, x_nonzero, _ = np.nonzero(image)
return image[np.min(y_nonzero):np.max(y_nonzero), np.min(x_nonzero):np.max(x_nonzero)]https://stackoverflow.com/questions/13538748
复制相似问题