首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用OpenCV裁剪黑边

使用OpenCV裁剪黑边
EN

Stack Overflow用户
提问于 2012-11-24 13:59:54
回答 7查看 49.8K关注 0票数 47

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

我只有这张图片。

黑边是无用的,所以我想把它们剪掉,只留下Windows图标(和蓝色背景)。

我不想计算Windows图标的坐标和大小。GIMP和Photoshop具有某种自动裁剪功能。OpenCV没有吗?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2012-11-24 15:17:51

我不确定你所有的图片都是这样的。但是对于这张图片,下面是一个简单的python-opencv代码来裁剪它。

第一个导入库:

代码语言:javascript
复制
import cv2
import numpy as np

读取图像,将其转换为灰度,并将阈值设为1的二值图像。

代码语言:javascript
复制
img = cv2.imread('sofwin.png')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
_,thresh = cv2.threshold(gray,1,255,cv2.THRESH_BINARY)

现在找到其中的轮廓。只有一个对象,所以找到它的边界矩形。

代码语言:javascript
复制
contours,hierarchy = cv2.findContours(thresh,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
cnt = contours[0]
x,y,w,h = cv2.boundingRect(cnt)

现在裁剪图像,并将其保存到另一个文件中。

代码语言:javascript
复制
crop = img[y:y+h,x:x+w]
cv2.imwrite('sofwinres.png',crop)

结果如下:

票数 68
EN

Stack Overflow用户

发布于 2015-05-30 06:59:45

代码语言:javascript
复制
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
票数 12
EN

Stack Overflow用户

发布于 2019-12-06 14:55:57

我认为这个答案要简洁得多:

代码语言:javascript
复制
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)]
票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13538748

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档