python - 我找不到适合新图像零点轮廓的方法

标签 python image opencv resize contour

enter image description here

我有一个二值图像,我想找到轮廓,将最大的一个轮廓放入一个新图像中,轮廓的大小就像一个矩形围绕着它一样。换句话说,将轮廓拟合到尺寸更小的新图像中。

查找轮廓例程是为整个图像查找一个矩形,我不需要它。我看一个尺寸(宽度 - 1,高度 - 1)的轮廓并跳过它。

我想删除最大的矩形,然后将第二大矩形放入新图像中。那个最大的矩形将成为新图像的界限。然后我想在新的白色图像中绘制轮廓。

我只是不太了解 OpenCV 以及执行此操作的最佳方法。

h = img.shape[0]
w = img.shape[1]
ret, img = cv2.threshold(img, 128, 255, cv2.THRESH_BINARY)
# are these the best find contours params?
contours, hierarchy = cv2.findContours(img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# paint a new image white
img = np.zeros((384, 640, 1), np.uint8)
img[:-1] = 255
# resize the contours
for i in range(0, len(contours)):
      for j in range(0, len(contours[i])):
         for k in range(0, len(contours[i][j])):
            if contours[i][j][k][1] != h - 1 or contours[i][j][k][0] != w -1:
               contours[i][j][k][1] = 384 * contours[i][j][k][1] / h
               contours[i][j][k][0] = 640 * contours[i][j][k][0] / w

我找不到找到整个文档的矩形的方法。最大的矩形是图像宽度 * 高度,但在第二个矩形中,只有黑色像素是可见的。

最佳答案

在评论中你声明你想要黑色像素作为图像的边界。在这种情况下,您可以使用下面的方法。它将图像加载为灰度,然后将其反转。所以原始图像中的白色现在是黑色(值:0),黑色变成白色(值:255)。接下来汇总所有行和列。总和大于零的第一行和最后一行/列是原始图像中黑色像素的边界。您可以使用这些值来切片新图像。

结果:

enter image description here

代码:

    import cv2
    import numpy as np
    # load the image as grayscale
    img = cv2.imread('mQTiR.png',0)
    #invert the image
    img_inv = cv2.bitwise_not(img)
    # sum each row and each column of the inverted image
    sumOfCols = np.sum(img_inv, axis=0)
    sumOfRows = np.sum(img_inv, axis=1)
    # get the indexes of the rows/cols that are nonzero (=black in scan)
    nonzeroX = np.nonzero(sumOfCols)[0]
    nonzeroY = np.nonzero(sumOfRows)[0]
    # get the first and last indexes, these are the bounds of the roi
    minY = nonzeroY[0]
    maxY = nonzeroY[-1]
    minX = nonzeroX[0]
    maxX = nonzeroX[-1]
    #create subimage
    subimage = img[minY:maxY,minX:maxX]
    #display subimage
    cv2.imshow('Result',subimage)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

关于python - 我找不到适合新图像零点轮廓的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57127734/

相关文章:

android - Instagram 如何在故事模式中增加背景中的图像颜色

jquery - 交换图像,改变宽度和高度

c++ - 从现有图像中裁剪出图像

python - bs4.FeatureNotFound : Couldn't find a tree builder with the features you requested: lxml. 需要安装解析器库吗?

python - 在同一台机器上安装不同版本的 Python 和 Anaconda

c - C中的图像缩放

opencv - 形态学运算 (OpenCV) 中的迭代与内核大小

python - 修改 2d-numpy 数组主对角线的一部分

python - 如何在线程池执行的函数中仅发送一次电子邮件?

python - TensorFlow对象检测API仅在框架的指定区域内(在输入框架中定义ROI)