给定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.
我正在研究视网膜眼底图像.图像由黑色背景上的圆形视网膜组成.通过OpenCV,我设法获得了围绕整个圆形Retina的轮廓.我需要的是从黑色背景中裁剪出圆形视网膜.
我正在尝试找到一个简单的算法来裁剪(删除黑色区域)使用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 Stitching合作过一段时间.现在我想做拼接的最后一步:裁剪图像.这导致在一般多边形中找到最大的内接轴平行矩形.
我已经用Google搜索并找到了一些答案(如何裁剪到OpenCV中最大的内部边界框?).尽管程序运行缓慢,但输出图像的质量仍然很好(裁剪图像需要15秒才能将36个1600x1200图像拼接成1个全景图,因为使用的算法时间复杂度很低(对于轮廓中的每个点,它扫描同一行/列中的所有点).
有什么方法可以改善吗?谢谢.
P/S:我也找到了这本书:
在多边形中找到最大面积轴平行矩形
Karen Daniels和Victor Milenkovicz Dan Rothx哈佛大学,
应用科学系,
计算技术研究中心,
剑桥,MA 02138.
1995年6月
但是我没有任何想法将这个理论应用到代码中:v
应用阈值并找到对象的轮廓后,我使用以下代码获取对象周围的直线矩形(或旋转的矩形输入其指令):
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)
现在我想调整对象的矩形作为背景像素和对象的关系的函数,即,在没有背景像素或背景像素较少的情况下占据对象的较大部分的矩形,例如:

我该如何创建呢?