您好,登錄后才能下訂單哦!
今天小編給大家分享一下如何使用OpenCV實現迷宮解密的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
如下圖所示,可以看到是一張較為復雜的迷宮圖,相信也有人嘗試過自己一點一點的找出口,但我們肉眼來解謎恐怕眼睛有點小難受,特別是走了半天發現這迷宮無解,代入一下已經生氣了,所以我們何必不直接開掛,使用opencv來代替我們尋找最優解。
恩,不錯,那就整!
此時我們的圖像就反了過來,我們只需要找到一條從入口連續到出口的黑線即可。
import cv2 import numpy as np img = 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('thresh3',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()
為了在原始迷宮圖像上顯示解決方案,首先將原來的迷宮分割成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 np img = 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('thresh3',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實現迷宮解密”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。