如何使用 Opencv 3.3 和 Python2.7 识别图像中的迷宫
How to recognizing a Maze in an image using Opencv3.3 and Pyhton2.7
嘿,我正在使用 Opencv3.3 和 Pyhton2.7 来识别图像中的迷宫。
我必须在图像中找到迷宫的最外层限制。
我尝试关闭迷宫的入口和出口间隙并找到最外面的形状。我致力于 来缩小差距,但它对我的问题毫无用处,因为我需要这些差距来解决迷宫问题。
这是原图
我想找到迷宫的最外层。
这就是我想要的
如何提取最外层的轮廓?
我会用 numpy
而不是 OpenCV 来做到这一点,但两者是兼容的,所以你可以混合搭配,或者一旦你了解我的处理方式,你就可以将该技术应用到 OpenCV它。
策略是对每一行的所有像素求和,并制作一个像素宽的图像(如下图右侧所示),它是每一行中所有像素的总和。然后我找到该列中的最大值并除以它以将所有内容标准化到 0..100 范围内。现在,该单像素宽图像中任何小于 30 的像素都意味着相应行在原始图像中的白色像素少于 30% - 即它大部分是黑色。
然后我对所有列进行相同的求和以生成列总和 - 如下图底部所示:
如果您想 Google,我认为有些人将此技术称为 "projection"。
因此,代码如下所示:
#!/usr/local/bin/python3
import numpy as np
from PIL import Image
# Load image - you can use OpenCV "imread()" just the same and convert to grayscale
im = np.array(Image.open('maze.jpg').convert('L'))
# Get height and width
h,w = im.shape[0:2]
# Make a single pixel wide column, same height as image to store row sums in
rowsums=np.empty((h))
# Sum all pixels in each row
np.sum(im,axis=1,out=rowsums)
# Normalize to range 0..100, if rowsum[i] < 30 that means fewer than 30% of the pixels in row i are white
rowsums /= np.max(rowsums)/100
# Find first and last row that is largely black
first = last = -1
for r in range(h):
if first < 0 and rowsums[r] < 30:
first = r
if rowsums[r] < 30:
last = r
print(first,last)
# Make a single pixel tall row, same width as image to store col sums in
colsums=np.empty((w))
# Sum all pixels in each col
np.sum(im,axis=0,out=colsums)
# Normalize to range 0..100, if colsum[i] < 30 that means fewer than 30% of the pixels in col i are white
colsums /= np.max(colsums)/100
# Find first and last col that is largely black
first = last = -1
for c in range(w):
if first < 0 and colsums[c] < 30:
first = c
if colsums[c] < 30:
last = c
print(first,last)
输出:
62 890
36 1509
所以迷宫的最上面一行是第62行,最下面一行是第890行。迷宫左边的列是第36列,最右边的列是第1509列。
如果我绘制一个 80% 透明的红色矩形来匹配这些位置,我得到:
嘿,我正在使用 Opencv3.3 和 Pyhton2.7 来识别图像中的迷宫。
我必须在图像中找到迷宫的最外层限制。
我尝试关闭迷宫的入口和出口间隙并找到最外面的形状。我致力于
这是原图
我想找到迷宫的最外层。
这就是我想要的
如何提取最外层的轮廓?
我会用 numpy
而不是 OpenCV 来做到这一点,但两者是兼容的,所以你可以混合搭配,或者一旦你了解我的处理方式,你就可以将该技术应用到 OpenCV它。
策略是对每一行的所有像素求和,并制作一个像素宽的图像(如下图右侧所示),它是每一行中所有像素的总和。然后我找到该列中的最大值并除以它以将所有内容标准化到 0..100 范围内。现在,该单像素宽图像中任何小于 30 的像素都意味着相应行在原始图像中的白色像素少于 30% - 即它大部分是黑色。
然后我对所有列进行相同的求和以生成列总和 - 如下图底部所示:
如果您想 Google,我认为有些人将此技术称为 "projection"。
因此,代码如下所示:
#!/usr/local/bin/python3
import numpy as np
from PIL import Image
# Load image - you can use OpenCV "imread()" just the same and convert to grayscale
im = np.array(Image.open('maze.jpg').convert('L'))
# Get height and width
h,w = im.shape[0:2]
# Make a single pixel wide column, same height as image to store row sums in
rowsums=np.empty((h))
# Sum all pixels in each row
np.sum(im,axis=1,out=rowsums)
# Normalize to range 0..100, if rowsum[i] < 30 that means fewer than 30% of the pixels in row i are white
rowsums /= np.max(rowsums)/100
# Find first and last row that is largely black
first = last = -1
for r in range(h):
if first < 0 and rowsums[r] < 30:
first = r
if rowsums[r] < 30:
last = r
print(first,last)
# Make a single pixel tall row, same width as image to store col sums in
colsums=np.empty((w))
# Sum all pixels in each col
np.sum(im,axis=0,out=colsums)
# Normalize to range 0..100, if colsum[i] < 30 that means fewer than 30% of the pixels in col i are white
colsums /= np.max(colsums)/100
# Find first and last col that is largely black
first = last = -1
for c in range(w):
if first < 0 and colsums[c] < 30:
first = c
if colsums[c] < 30:
last = c
print(first,last)
输出:
62 890
36 1509
所以迷宫的最上面一行是第62行,最下面一行是第890行。迷宫左边的列是第36列,最右边的列是第1509列。
如果我绘制一个 80% 透明的红色矩形来匹配这些位置,我得到: