【问题标题】:How to crop an image based on a complex criteria?如何根据复杂的标准裁剪图像?
【发布时间】:2020-05-17 16:00:13
【问题描述】:

我有一组类似的图像,如下图。我想保留顶部红色“不规则”矩形内的图像部分(绿色箭头代表我要保留的空间;我想裁剪掉外面的任何东西。是否有 python opencv 代码可以做到这一点我?我一直在尝试使用 opencv 解决阈值问题,但它不适合我。

原图:

我要保留的区域(我要保留的空间以绿色箭头突出显示):

期望的输出:

非常感谢

【问题讨论】:

  • 你不是说在第一条红色摆动线之上吗?您能否提供更多关于感兴趣区域在您的其他图像中的位置的详细信息。如果它总是在顶部,你可以用白色填充它(并使其余部分变成黑色),做一些形态,然后用它作为一个带有 numpy 的蒙版来提取那个区域。
  • 感谢您的回复。我可以看出我的话可能没有意义。我想“保持”顶部红色边界内的区域..这样就包括我放入所需输出的黑色区域。希望这是有道理的。
  • 您可以填充图像的第一部分,然后提取 blob。此外,如果您的 blob 始终具有图像的最大区域,您还可以尝试对每个区域进行泛洪填充并寻找最大的 blob。
  • 您没有回答是否要提取所有图像中的最顶部区域。
  • 是的...所以基本上我只想保留最上面的红色边框下方、左侧红色边框右侧、右侧红色边框左侧和第一个上方的区域弯曲的红线。我想去掉下面的区域,包括中间弯曲的红线。

标签: python opencv crop


【解决方案1】:

我会这样做。执行cv2.imwrite() 的代码仅用于调试,因此您可以看到各个阶段,我已将临时的中间图像放在生成它们的位置,但是您可以将所有代码块并将它们附加在一起以制作一个连续的一段代码:

#!/usr/bin/env python3

import cv2
import numpy as np

# Load image
im = cv2.imread('wavy.png')
copy = im.copy()

# Flood fill with white starting from 10,10
cv2.floodFill(copy,mask=None,seedPoint=(10,10),newVal=(255,255,255))
cv2.imwrite('temp1.png',copy)

# Make everything not white into black
copy[~np.all(copy == (255, 255, 255), axis=-1)] = (0,0,0)
cv2.imwrite('temp2.png',copy)

# Make white all the bits we don't want at the bottom of the original image
im[:] |= ~copy

# Crop/trim part we want
Ynonzero, Xnonzero, _ = np.nonzero(copy)
res = im[np.min(Ynonzero):np.max(Ynonzero), np.min(Xnonzero):np.max(Xnonzero)]

# Save result
cv2.imwrite('result.png',res)

【讨论】:

    猜你喜欢
    • 2020-04-16
    • 2022-07-24
    • 1970-01-01
    • 2016-05-04
    • 2020-06-26
    • 2012-11-02
    • 2020-06-22
    • 2021-10-02
    • 1970-01-01
    相关资源
    最近更新 更多