使用OpenCV和Python(正確)旋轉(zhuǎn)圖像(P1)
在這篇文章的剩余部分,我將討論使用OpenCV和Python旋轉(zhuǎn)圖像時可能遇到的常見問題。
具體來說,我們將研究在旋轉(zhuǎn)過程中,當(dāng)圖像的角點(diǎn)被“切斷”時會發(fā)生什么。
為了確保我們都理解OpenCV和Python的輪換問題,我將:
從一個簡單的例子開始演示旋轉(zhuǎn)問題。
提供旋轉(zhuǎn)功能,確保圖像在旋轉(zhuǎn)過程中不會被切斷。
討論我是如何使用此方法解決藥片識別問題的。
OpenCV的一個簡單旋轉(zhuǎn)問題
讓我們以一個示例腳本開始這篇博客文章。
打開一個新文件,將其命名為rotate_simple.py,并輸入以下代碼:
第3-6行首先導(dǎo)入我們所需的Python包。
如果您還沒有安裝imutils,即我的OpenCV便利功能系列,那么現(xiàn)在就可以在終端中輸入以下代碼:
如果已經(jīng)安裝了imutils,請確保已升級到最新版本:
從這里開始,第8-10行解析我們的命令行參數(shù)。我們在這里只需要一個開關(guān),——image,這是我們的映像駐留在磁盤上的路徑。
讓我們繼續(xù)實(shí)際旋轉(zhuǎn)我們的圖像:
第15行加載我們要從磁盤旋轉(zhuǎn)的圖像。
然后,我們以15度的增量(第18行)在[0,360]范圍內(nèi)的各種角度上循環(huán)。
對于每一個角度,我們稱之為imutils。旋轉(zhuǎn),將圖像圍繞圖像中心旋轉(zhuǎn)指定數(shù)量的角度。然后我們將旋轉(zhuǎn)后的圖像顯示到屏幕上。
第24-27行執(zhí)行相同的過程,但這次我們稱之為imutils.rotate_bound(我將在下一節(jié)提供此函數(shù)的實(shí)現(xiàn))。
正如該方法的名稱所示,我們將確保整個圖像都綁定在窗口內(nèi),并且沒有任何圖像被切斷。
要查看此腳本的運(yùn)行情況,請確保使用本文的結(jié)尾部分找到源代碼,然后執(zhí)行以下命令:
使用imutils的輸出。非方形圖像上的旋轉(zhuǎn)功能如下所示:
(圖還沒做好,過一段時間會補(bǔ)上)
正如你所看到的,圖像在旋轉(zhuǎn)時被“切斷”——無法將整個圖像放在視野中。
但如果我們使用imutils。我們可以解決這個問題:
(同上圖)
太棒了,我們解決了問題!
那么這是否意味著我們應(yīng)該始終使用.rotate_bound到.rotate法?
是什么讓它如此特別?
究竟發(fā)生了什么?
我將在下一節(jié)回答這些問題。