Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在这些图像中找到最大的空白?_Python_Algorithm_Opencv_Image Processing - Fatal编程技术网

Python 如何在这些图像中找到最大的空白?

Python 如何在这些图像中找到最大的空白?,python,algorithm,opencv,image-processing,Python,Algorithm,Opencv,Image Processing,我想在与我在下面发布的图片类似的图片中找到空白(黑色区域),在这里我随机地调整了分散在其中的块的大小 对于空白,我指的是这些可能的开放字段(我对该区域没有特定的下限,但我想提取图像中出现的前3-4个最大字段)。它们可以采用的几何形状也没有限制,但这些空白不得包含任何蓝色块 最好的办法是什么 我到目前为止所做的: 我的原始图像实际上是这样的。我识别了所有的点,根据一定的距离阈值对它们进行分组,并在它们周围应用了一个凸包。我不确定如何进一步进行。任何帮助都将不胜感激。谢谢大家! 在Python/

我想在与我在下面发布的图片类似的图片中找到空白(黑色区域),在这里我随机地调整了分散在其中的块的大小

对于空白,我指的是这些可能的开放字段(我对该区域没有特定的下限,但我想提取图像中出现的前3-4个最大字段)。它们可以采用的几何形状也没有限制,但这些空白不得包含任何蓝色块

最好的办法是什么

我到目前为止所做的:

我的原始图像实际上是这样的。我识别了所有的点,根据一定的距离阈值对它们进行分组,并在它们周围应用了一个凸包。我不确定如何进一步进行。任何帮助都将不胜感激。谢谢大家!


在Python/OpenCV中,有一种方法使用距离变换来查找X之间的最大欧几里德距离

输入:


距离变换图像:

到Xs的最大距离区域:

文本信息:


中心x,y:(179352)半径:92.5286865234375

类似的东西?是的,类似的东西,但我的情况下近似结果是可以的。我解释一下,但你写了这样的东西,“只要黑色斑点不包含蓝色斑点,黑色斑点的几何形状就没有限制”如果你想找到最大的不包含任何蓝色的黑色斑点,那么只需取整个黑色区域。整个黑色背景是一个非常奇怪的形状,但它肯定不包含蓝色。如果没有限制,那么可以将黑色的东西视为一个形状。我认为你确实对允许哪些几何形状有限制,但你不知道如何表达这些限制。如果你在寻找凸面形状,这个问题被称为“凸面头骨”,迄今为止最著名的解决方案是O(n^7),其中n是输入多边形中的顶点数。我认为你最好使用fmw42答案中的循环假设。@VS:你对塞缪尔问题的回答并不能真正回答它,因为现在我可以问,“整个黑色区域减去左上角的像素怎么样?”等等。你需要描述一类允许的区域,这样一个程序,给定一个任意区域,无法确定是否允许该区域。一个典型的例子可能是“只允许凸面多边形”(除非这不是您想要的,因为您的例子包含非凸面多边形)。另外,我不清楚你所说的“边界”是什么意思。它们看起来有点像沃罗诺图,我想这不是巧合?对。从文档中可以看出,“该函数提供了一种非常快速的方法来计算二值图像的Voronoi图”。看见但在距离图像中,必须在局部最大值上设置阈值才能获得Voronoi图像边缘
import cv2
import numpy as np
import skimage.exposure

# read image
img = cv2.imread('xxx.png')

# convert to gray
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# threshold to binary and invert so background is white and xxx are black
thresh = cv2.threshold(gray, 128, 255, cv2.THRESH_BINARY)[1]
thresh = 255 - thresh

# add black border around threshold image to avoid corner being largest distance
thresh2 = cv2.copyMakeBorder(thresh, 1,1,1,1, cv2.BORDER_CONSTANT, (0))
h, w = thresh2.shape

# create zeros mask 2 pixels larger in each dimension
mask = np.zeros([h + 2, w + 2], np.uint8)

# apply distance transform
distimg = thresh2.copy()
distimg = cv2.distanceTransform(distimg, cv2.DIST_L2, 5)

# remove excess border
distimg = distimg[1:h-1, 1:w-1]

# get max value and location in distance image
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(distimg)

# scale distance image for viewing
distimg = skimage.exposure.rescale_intensity(distimg, in_range='image', out_range=(0,255))
distimg = distimg.astype(np.uint8)

# draw circle on input
result = img.copy()
centx = max_loc[0]
centy = max_loc[1]
radius = int(max_val)
cv2.circle(result, (centx, centy), radius, (0,0,255), 1)
print('center x,y:', max_loc,'center radius:', max_val)

# save image
cv2.imwrite('xxx_distance.png',distimg)
cv2.imwrite('xxx_radius.png',result)

# show the images
cv2.imshow("thresh", thresh)
cv2.imshow("thresh2", thresh2)
cv2.imshow("distance", distimg)
cv2.imshow("result", result)
cv2.waitKey(0)
cv2.destroyAllWindows()