我曾与OpenCV Stitching合作过一段时间.现在我想做拼接的最后一步:裁剪图像.这导致在一般多边形中找到最大的内接轴平行矩形.
我已经用Google搜索并找到了一些答案(如何裁剪到OpenCV中最大的内部边界框?).尽管程序运行缓慢,但输出图像的质量仍然很好(裁剪图像需要15秒才能将36个1600x1200图像拼接成1个全景图,因为使用的算法时间复杂度很低(对于轮廓中的每个点,它扫描同一行/列中的所有点).
有什么方法可以改善吗?谢谢.
P/S:我也找到了这本书:
在多边形中找到最大面积轴平行矩形
Karen Daniels和Victor Milenkovicz Dan Rothx哈佛大学,
应用科学系,
计算技术研究中心,
剑桥,MA 02138.
1995年6月
但是我没有任何想法将这个理论应用到代码中:v
输入图片:

输出图像:

我在图像中有几个彩色斑点,我试图在每种颜色的最大斑点内创建矩形(或正方形 - 这似乎更容易).我已经找到了如何创建一个界定单个最大blob的矩形的答案,但我不确定如何找到一个简单地适合blob内部的正方形.它不一定是最大的,它必须大于某个区域,否则我就不会包含它.我也看到了一些关于多边形的工作,但没有用于非晶形状.
应用阈值并找到对象的轮廓后,我使用以下代码获取对象周围的直线矩形(或旋转的矩形输入其指令):
img = cv2.imread('image.png')
imgray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(imgray,127,255,cv2.THRESH_BINARY)
# find contours
contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
cnt = contours[0]
# straight rectangle
x,y,w,h = cv2.boundingRect(cnt)
img= cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)
Run Code Online (Sandbox Code Playgroud)
看到图像

然后我使用以下代码计算了直线矩形内的对象和背景像素数:
# rectangle area (total number of object and background pixels inside the rectangle)
area_rect = w*h
# white or object pixels (inside the rectangle)
obj = cv2.countNonZero(imgray)
# background pixels (inside the rectangle)
bac = area_rect - obj
Run Code Online (Sandbox Code Playgroud)
现在我想调整对象的矩形作为背景像素和对象的关系的函数,即,在没有背景像素或背景像素较少的情况下占据对象的较大部分的矩形,例如:

我该如何创建呢?
我有像这样的二值化图像:
我需要确定内部实心磁盘的中心和半径.正如您所看到的,它被一个接触它的纹理区域所包围,因此简单的连接组件检测不起作用.无论如何,周边的很大一部分都有一个空隙.
可能的治愈方法可能是通过侵蚀直到所有纹理消失或从磁盘断开,但这可能是耗时的并且迭代次数不确定.(此外,在一些不幸的情况下,磁盘上有小孔,随着侵蚀而增长.)
有没有更好的建议以强大而快速的方式解决这个问题?(我标记了OpenCV,但这不是强制性的,重要的是方法.)
我正在尝试按照此处的答案中的代码进行操作:在 N×N 二进制矩阵中查找仅包含零的最大矩形
我很难理解如何找到(x,y)算法找到的最大矩形的原点。
来自收藏
import namedtuple
from operator import mul
import numpy as np
import functools
x = np.zeros(shape=(4,5))
x[0][0] = 1
x[0][1] = 1
x[0][2] = 1
x[0][3] = 1
x[1][0] = 1
x[1][1] = 1
x[1][2] = 1
x[1][3] = 1
print(x)
print(max_size(x))
Info = namedtuple('Info', 'start height')
def find_maximum_frame(mat, value=1):
"""Find height, width of the largest rectangle containing all `value`'s."""
it = iter(mat)
hist = [(el==value) for el in next(it, [])]
max_size, _ …Run Code Online (Sandbox Code Playgroud) 我有一个带有边界框的图像,如下所示:
我想合并重叠的边界框。
我试过: cv::groupRectangles(detected, 1, 0.8)
我的期望是每个集群都有一个盒子。
但我得到了这个:
正如你所看到的,问题是,中间的飞镖板和右边的飞镖板没有盒子。
我该如何解决?我更喜欢使用 OpenCV api 而不是编码我自己的合并算法。
我看到它消除了恰好由一个盒子包围的区域。我希望它不要那样做。
我曾尝试随机调整参数,但结果更糟。我希望得到一些正确方向的指导。