相关疑难解决方法(0)

找到N×N二进制矩阵中仅包含零的最大矩形

给定NxN二进制矩阵(仅包含0或1),我们如何才能找到包含全0的最大矩形?

例:

      I
    0 0 0 0 1 0
    0 0 1 0 0 1
II->0 0 0 0 0 0
    1 0 0 0 0 0
    0 0 0 0 0 1 <--IV
    0 0 1 0 0 0
            IV 
Run Code Online (Sandbox Code Playgroud)

对于上面的例子,它是一个6×6的二进制矩阵.在这种情况下,返回值将是单元格1:(2,1)和单元格2:(4,4).得到的子矩阵可以是正方形或矩形.返回值也可以是所有0的最大子矩阵的大小,在该示例中为3×4.

arrays algorithm

73
推荐指数
4
解决办法
5万
查看次数

如何裁剪轮廓的内部区域?

我正在研究视网膜眼底图像.图像由黑色背景上的圆形视网膜组成.通过OpenCV,我设法获得了围绕整个圆形Retina的轮廓.我需要的是从黑色背景中裁剪出圆形视网膜.

python opencv image image-processing contour

17
推荐指数
3
解决办法
3万
查看次数

求多边形中最大的内接矩形

我有一堆带有红色标记多边形的图像(255,0,0): 在此输入图像描述

我想提取边界框,但在多边形内部,如蓝色矩形所示: 在此输入图像描述

OpenCV cv.boundingRect 给了我外部边界框,但如何提取内部边界框?

python geometry opencv

9
推荐指数
3
解决办法
8568
查看次数

在OpenCV中裁剪全景图像

我正在尝试找到一个简单的算法来裁剪(删除黑色区域)使用openCV Stitcher模块创建的全景图像.

我的想法是计算图像中最内部的黑点,它将定义裁剪区域,如下图所示:

在此输入图像描述

预期的裁剪结果:

在此输入图像描述

我已经尝试了接下来的两种方法,但它们没有按预期裁剪图像:

第一种方法:

void testCropA(cv::Mat& image)
{
    cv::Mat gray;
    cvtColor(image, gray, CV_BGR2GRAY);

    Size size = gray.size();
    int type = gray.type();
    int left = 0, top = 0, right = size.width, bottom = size.height;

    cv::Mat row_zeros = Mat::zeros(1, right, type);
    cv::Mat col_zeros = Mat::zeros(bottom, 1, type);

    while (countNonZero(gray.row(top) != row_zeros) == 0) { top++; }

    while (countNonZero(gray.col(left) != col_zeros) == 0) { left++; }

    while (countNonZero(gray.row(bottom-1) != row_zeros) == 0) { bottom--; }

    while (countNonZero(gray.col(right-1) != col_zeros) == …
Run Code Online (Sandbox Code Playgroud)

opencv crop opencv-stitching

8
推荐指数
1
解决办法
1339
查看次数

任意多边形中最大的内接矩形

我曾与OpenCV Stitching合作过一段时间.现在我想做拼接的最后一步:裁剪图像.这导致在一般多边形中找到最大的内接轴平行矩形.

我已经用Google搜索并找到了一些答案(如何裁剪到OpenCV中最大的内部边界框?).尽管程序运行缓慢,但输出图像的质量仍然很好(裁剪图像需要15秒才能将36个1600x1200图像拼接成1个全景图,因为使用的算法时间复杂度很低(对于轮廓中的每个点,它扫描同一行/列中的所有点).

有什么方法可以改善吗?谢谢.

P/S:我也找到了这本书:

在多边形中找到最大面积轴平行矩形

Karen Daniels和Victor Milenkovicz Dan Rothx哈佛大学,

应用科学系,

计算技术研究中心,

剑桥,MA 02138.

1995年6月

但是我没有任何想法将这个理论应用到代码中:v

c++ algorithm math opencv

5
推荐指数
1
解决办法
3735
查看次数

如何在不包含(或少数几个)背景像素的情况下调整或调整对象内的矩形?

应用阈值并找到对象的轮廓后,我使用以下代码获取对象周围的直线矩形(或旋转的矩形输入其指令):

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)

现在我想调整对象的矩形作为背景像素和对象的关系的函数,即,在没有背景像素或背景像素较少的情况下占据对象的较大部分的矩形,例如:

我该如何创建呢?

python opencv

4
推荐指数
1
解决办法
4683
查看次数