一、你能自己走出迷宫吗?

如下图所示,可以看到是一张较为复杂的迷宫图,相信也有人尝试过自己一点一点的找出口,但我们肉眼来解谜恐怕眼睛有点小难受,特别是走了半天发现这迷宫无解,代入一下已经生气了,所以我们何必不直接开挂,使用opencv来代替我们寻找最优解。

恩,不错,那就整!

注:图像自己截图获取即可。

二、使用OpenCV找出出口。

1、对图像进行二值化处理。

此时我们的图像就反了过来,我们只需要找到一条从入口连续到出口的黑线即可。

import cv2
import numpy as npimg = cv2.imread('../photos/1.png')
# cv2.imshow('maze',img)
# cv2.waitKey(0)
# cv2.destroyAllWindows()#对图像进行二值化
# Binary conversion
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)#反转tholdolding将给我们一个二进制的图像与白色的墙壁和黑色的背景。
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY_INV)
cv2.imshow('THRESH_BINARY_INV',thresh)
cv2.waitKey(0)
cv2.destroyAllWindows()

2、 对二值化后的图像进行轮廓检测并标注

可以看到大致路线已经出现。

#对二值化处理的图像进行轮廓检测并标注
# Contours
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)
print('len(contours):',len(contours))# dc=cv2.drawContours(thresh, contours, 0, (255, 255, 255), -1)
#用不同颜色来标注
dc=cv2.drawContours(thresh, contours, 0, (255, 255, 255), 5)# TODO 大迷宫的len(contours): 26
dc=cv2.drawContours(dc, contours, 1, (0, 0, 0), 5)
cv2.imshow('drawContours',dc)
cv2.waitKey(0)
cv2.destroyAllWindows()

3、对图像阈值进行处理。

#对图像阈值进行处理
ret, thresh = cv2.threshold(dc, 240, 255, cv2.THRESH_BINARY)# ret, thresh = cv2.threshold(thresh, 240, 255, cv2.THRESH_BINARY)
cv2.imshow('thresh2',thresh)
cv2.waitKey(0)
cv2.destroyAllWindows()

4、对图像进行扩展操作。

扩张是数学形态领域的两个基本操作者之一,另一个是侵蚀。它通常应用于二进制图像,但有一些版本可用于灰度图像。
        操作者对二进制图像的基本效果是逐渐扩大前景像素区域的边界(通常为白色像素)。因此,前景像素的面积大小增加,而这些区域内的孔变小。

# Dilate
ke = 10
# kernel = np.ones((19, 19), np.uint8)
kernel = np.ones((ke, ke), np.uint8)
dilation = cv2.dilate(thresh, kernel, iterations=1)
cv2.imshow('dilation',dilation)
cv2.waitKey(0)
cv2.destroyAllWindows()

5、对图像进行侵蚀操作。

侵蚀是第二个形态运算符。它也适用于二进制图像。操作者对二进制图像的基本效果是消除前景像素区域的边界(通常为白色像素)。
        因此,前景像素的面积缩小,并且这些区域内的孔变大。

# Erosion
erosion = cv2.erode(dilation, kernel, iterations=1)
cv2.imshow('erosion',erosion)
cv2.waitKey(0)
cv2.destroyAllWindows()

6、分裂迷宫通道找出路径。

为了在原始迷宫图像上显示解决方案,首先将原来的迷宫分割成r,g,b组件。现在通过反转diff图像创建一个掩码。使用在最后一步中创建的掩码的原始迷宫的按位和r和g分量。这一步将从迷宫解决方案的图像部分去除红色和绿色成分。最后一个是合并所有组件,我们将使用蓝色标记的解决方案。

到此我们的迷宫也就走通了,总得来说还是比人眼快一些,当然如果你眼观八方那当我没说 ̄□ ̄||

#找到两个图像的差异
diff = cv2.absdiff(dilation, erosion)# 分裂迷宫的通道
b, g, r = cv2.split(img)
mask_inv = cv2.bitwise_not(diff)# masking out the green and red colour from the solved path
r = cv2.bitwise_and(r, r, mask=mask_inv)
g = cv2.bitwise_and(g, g, mask=mask_inv)res = cv2.merge((b, g, r))
cv2.imshow('Solved Maze', res)cv2.waitKey(0)
cv2.destroyAllWindows()

三、完整代码如下。

import cv2
import numpy as npimg = cv2.imread('../photos/1.png')
cv2.imshow('maze',img)
cv2.waitKey(0)
cv2.destroyAllWindows()#对图像进行二值化
# Binary conversion
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)#反转tholdolding将给我们一个二进制的图像与白色的墙壁和黑色的背景。
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY_INV)
cv2.imshow('THRESH_BINARY_INV',thresh)
cv2.waitKey(0)
cv2.destroyAllWindows()#对二值化处理的图像进行轮廓检测并标注
# Contours
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)
print('len(contours):',len(contours))# dc=cv2.drawContours(thresh, contours, 0, (255, 255, 255), -1)
#用不同颜色来标注
dc=cv2.drawContours(thresh, contours, 0, (255, 255, 255), 5)# TODO 大迷宫的len(contours): 26
dc=cv2.drawContours(dc, contours, 1, (0, 0, 0), 5)
cv2.imshow('drawContours',dc)
cv2.waitKey(0)
cv2.destroyAllWindows()#对图像阈值进行处理
ret, thresh = cv2.threshold(dc, 240, 255, cv2.THRESH_BINARY)# ret, thresh = cv2.threshold(thresh, 240, 255, cv2.THRESH_BINARY)
cv2.imshow('thresh2',thresh)
cv2.waitKey(0)
cv2.destroyAllWindows()'''
扩张
扩张是数学形态领域的两个基本操作者之一,另一个是侵蚀。它通常应用于二进制图像,但有一些版本可用于灰度图像。
操作者对二进制图像的基本效果是逐渐扩大前景像素区域的边界(通常为白色像素)。因此,前景像素的面积大小增加,而这些区域内的孔变小。'''
# Dilate
ke = 10
# kernel = np.ones((19, 19), np.uint8)
kernel = np.ones((ke, ke), np.uint8)
dilation = cv2.dilate(thresh, kernel, iterations=1)
cv2.imshow('dilation',dilation)
cv2.waitKey(0)
cv2.destroyAllWindows()# Erosion
#侵蚀是第二个形态运算符。它也适用于二进制图像。操作者对二进制图像的基本效果是消除前景像素区域的边界(通常为白色像素)。
# 因此,前景像素的面积缩小,并且这些区域内的孔变大。
erosion = cv2.erode(dilation, kernel, iterations=1)
cv2.imshow('erosion',erosion)
cv2.waitKey(0)
cv2.destroyAllWindows()#找到两个图像的差异
diff = cv2.absdiff(dilation, erosion)
cv2.imshow('diff',diff)
cv2.waitKey(0)
cv2.destroyAllWindows()# 分裂迷宫的通道
b, g, r = cv2.split(img)
mask_inv = cv2.bitwise_not(diff)
#为了在原始迷宫图像上显示解决方案,首先将原来的迷宫分割成r,g,b组件。现在通过反转diff图像创建一个掩码。
# 使用在最后一步中创建的掩码的原始迷宫的按位和r和g分量。这一步将从迷宫解决方案的图像部分去除红色和绿色成分。
# 最后一个是合并所有组件,我们将使用蓝色标记的解决方案。
# masking out the green and red colour from the solved path
r = cv2.bitwise_and(r, r, mask=mask_inv)
g = cv2.bitwise_and(g, g, mask=mask_inv)res = cv2.merge((b, g, r))
cv2.imshow('Solved Maze', res)cv2.waitKey(0)
cv2.destroyAllWindows()

如有帮助点一下感谢:→ → → →  → → → → → → → → → → → → → → → → →↓

OpenCV-迷宫解密相关推荐

  1. C语言老鼠走迷宫(单路径)算法详细讲解

    最近在学习C语言的一些经典算法,其中遇到了一点困难,导致卡进度了.琢磨了很久,在绘制流程图时,突然灵感大开理解了,老鼠走迷宫算法的奇妙.所以写了这个,一来是方便以后右和我类似的同学自学时,遇到这个问题 ...

  2. OpenCV-Python-Tutorial[6]

    参考:https://github.com/makelove/OpenCV-Python-Tutorial ch200_Extra_modules Camera Calibration using C ...

  3. dji大疆机器人冬令营_2019RoboMaster高中生机器人冬令营火热进行中

    近日,2019年RoboMaster高中生机器人冬令营在深圳市大疆创新RoboMaster研发基地举行.来自人大附中.衡水中学.华中师范大学第一附属中学等全国顶尖中学的98名优秀高中生,从逾千名报名者 ...

  4. 【OpenCV 例程 300篇】221.加密马赛克图像处理与解密复原

    『youcans 的 OpenCV 例程200篇 - 总目录』 [youcans 的 OpenCV 例程 300篇]221.加密马赛克图像处理与解密复原 9. 图像的马赛克处理 马赛克效果是广泛使用的 ...

  5. 利用Python+OpenCV对图像加密/解密

    原文地址:利用Python.OpenCV对图像加密解密 | QuantumCloud蕴藏一个有趣.不难且实用的理论知识https://myblog.quantumcloud.top/2021/05/1 ...

  6. 解密 | OpenCV加载图像大小是有限制的 ?

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 问题来由 最近有人问一个问题,就是它有个大小800MB的图像文件, ...

  7. Opencv实现图像的加密解密

    1.基础:基于异或操作实现图像加密解密 一般情况下,图像的加密和解密过程是通过按位异或运算实现的.将原始图像与密钥图像进行按位异或,可以实现加密,将加密后的图像与密钥图像再进行按位异或可以实现解密过程 ...

  8. python opencv图像加密解密算法优化

    今天给大家带来的是图像加密解密算法的优化 这是我的设计思路 import cv2 import numpy as np aaa=cv2.imread("xxx.jpg",0) // ...

  9. 基于opencv的相机之加密解密功能实现(十三)

    简介 本篇是对实现图片处理功能:[加密解密]实现的记录. 实现原理 在图片上滑动的时候,会有红色画笔功能,用户可以在图片上画出想要加密的文字.图像等信息.在初始化的时候,将被加密图片的所有R分量像素全 ...

  10. 图像信息隐藏与解密(OpenCV)

    目录 一.图像隐藏的意义: 二.图像隐藏的原理: 三.示例图片: 四.隐藏信息的过程: 1)读取源图像(将写上需隐藏文字的信息)和载体图像,构造图像矩阵. 2)在源图像中加上水印文字作为待隐藏文字. ...

最新文章

  1. UVa 10051 Tower of Cubes(类似LIS)
  2. 30 段极简 Python 代码:这些小技巧你都 Get 了么?
  3. MongoDB · 引擎特性 · MongoDB索引原理
  4. ajax formdata 获取表单数据,node处理表单文件,获取formdata的数据
  5. 1050 螺旋矩阵 (25 分
  6. 【研究方向是SDN该怎么做?】软件定义网络(SDN)的安全挑战和机遇
  7. mysql企业监控_mysql企业监控
  8. 如何安装和配置 AngularJS Eclipse
  9. 怎样定义函数,调用函数
  10. BETA冲刺(6/7)
  11. 连接服务器切换无线,怎么用路由器连接别人的wifi?
  12. SAR图像滤波方法比较与分析
  13. 关于flask入门教程-记录集转jsonify
  14. Java Ftp客户端
  15. 随笔 | “郑秋冬”随想
  16. 绘画教程:头发怎么画?初学者如何画好头发?
  17. linux使分区生效,Linux 硬盘分区生效命令partprobe
  18. React 360 初体验介绍与环境搭建
  19. 成为职业游戏建模师该如何学习?
  20. 决策树算法介绍(ID3算法和CART算法)

热门文章

  1. 对不起,我错了!我聊一下最近恰饭的事情
  2. ajax和spa的区别,SPA项目经验总结
  3. 人工智能学习07--pytorch18--目标检测:Faster RCNN源码解析(pytorch)
  4. 使用Apache文件上传控件实现文件上传
  5. 前端必学的6个HTML+CSS特效
  6. 【自】要嫁就嫁Fintech工程师—钱多话少死的早
  7. 亚像素Sub Pixel
  8. 您的连接不是私密连接解决 ,netsarang官网进不去
  9. MATLAB算法实战应用案例精讲-【深度学习】多尺度特征提取(论文篇二)
  10. 交换机的背板带宽、交换容量、包转发率是怎么计算的?为啥各厂家标的都比线速转发要高...