故事開(kāi)始了,Python 圖像算法取經(jīng)之旅 365 天的第 1 天
如果你有想要交流的想法、技術(shù),歡迎在評(píng)論區(qū)留言。
圖像算法 這個(gè)系列橡皮擦一直不太想寫(xiě),因?yàn)樘y了,對(duì)技術(shù)棧體系是一無(wú)所知的。而且橡皮擦數(shù)學(xué)目前估計(jì)就剩下初二的水平了,承擔(dān)這樣一個(gè)系列博客,想想自己就挺害怕的。
不過(guò)人想要進(jìn)步,就要跳出自己的舒適圈,挑戰(zhàn)一下有難度的事情。
這個(gè)系列會(huì)寫(xiě)一年之久,希望有能和橡皮擦堅(jiān)持到最后一天的朋友。
學(xué)習(xí)者背景描述
對(duì)橡皮擦自己畫(huà)個(gè)畫(huà)像,如果你比我強(qiáng),你也可以堅(jiān)持到最后一步。
目前我的硬技能只有一個(gè):
熟悉 Python 語(yǔ)法,對(duì)其比較了解,所以不存在編程語(yǔ)言基礎(chǔ)障礙
學(xué)習(xí)上的難點(diǎn):
數(shù)學(xué)基礎(chǔ)差,目前剩余支持停留在二元一次方程階段;
圖像識(shí)別理論體系不健全,存在走彎路的可能;
以上是對(duì)自己的簡(jiǎn)單畫(huà)像,概括下來(lái)就是有編程基礎(chǔ),無(wú)任何數(shù)學(xué)基礎(chǔ)。
總之一句話:
任何事情都是開(kāi)始之后,才有未來(lái),而不是總在想,一直不敢開(kāi)始。
說(shuō)干就干,學(xué)習(xí)的過(guò)程是這樣子的。
每天只能學(xué)習(xí)大概 1 個(gè)小時(shí)左右,畢竟打工人不好持續(xù)輸出,而且我還欠著滾雪球?qū)W Python 那個(gè)專(zhuān)欄呢;
文章不是每天都更新,可能 2~3 天學(xué)習(xí)到都更新出來(lái);
因?yàn)闆](méi)有體系,學(xué)習(xí)的過(guò)程會(huì)充滿(mǎn)跳躍性,橡皮擦盡量把過(guò)程忠實(shí)的記錄下來(lái),這些可能都是比較珍貴的學(xué)習(xí)經(jīng)歷;
因?yàn)橛芯幊坦Φ祝陨婕罢Z(yǔ)言基礎(chǔ)部分,基本都會(huì)略過(guò)。
本系列課程你能得到
你可以近距離圍觀一個(gè)老程序員是如何學(xué)習(xí)一套新技能的;
你可以看一下一個(gè)老網(wǎng)蟲(chóng)是如何查找資料的;
最終你也可能隨著橡皮擦一起學(xué)會(huì) Python 圖像處理;
過(guò)程中你可能需要跟著橡皮擦一起去補(bǔ)數(shù)學(xué)基礎(chǔ),沒(méi)準(zhǔn)就學(xué)會(huì)數(shù)學(xué)啦。
第一天這一個(gè)小時(shí)發(fā)生的事情
對(duì)于學(xué)習(xí) Python 圖像處理,不能說(shuō)完全陌生,至少在橡皮擦印象中存在一個(gè) OpenCV 可以去弄。
有印象就是重要的內(nèi)容,先從它下手。
打開(kāi)搜索引擎,購(gòu)物網(wǎng)站,CSDN 搜索,檢索資料,找一些自己感興趣的內(nèi)容,先點(diǎn)開(kāi)看看,是不是靠譜。
打開(kāi)百度,看到前面有幾篇文章,下面是官方網(wǎng)址了,先存儲(chǔ)一下官網(wǎng),放心這種東西絕對(duì)有用。
https://docs.opencv.org/master/d0/de3/tutorial_py_intro.html
然后習(xí)慣性的把網(wǎng)址后面的東西都刪除掉。
https://docs.opencv.org
得到下面的網(wǎng)站,呦呵,不同版本的文檔,存著吧,肯定有用。
在把網(wǎng)址中的 docs 修改為 www,得到官網(wǎng)地址:https://opencv.org/,順便認(rèn)識(shí)一下 OpenCV 標(biāo)準(zhǔn)寫(xiě)法與 LOGO:
https://www.cnblogs.com/silence-cho/p/10926248.html
排名第二的就是 CSDN 的博主的博客了,打開(kāi)看了一下,內(nèi)容比較簡(jiǎn)單,好在他也有一個(gè)小專(zhuān)欄。
https://blog.csdn.net/sunny2038/category_904451.html
看完標(biāo)題之后,差點(diǎn)就勸退了橡皮擦,文章有點(diǎn)老了,2013 年,那時(shí)橡皮擦還在北京做開(kāi)發(fā)呢。
存儲(chǔ)一些待看博客之后,在去 CSDN 搜索查看一下,恩?,看到了大佬。
注意 CSDN 有個(gè)神奇的操作,可以選擇發(fā)布時(shí)間與博主等級(jí)。
再次得到了一些文章,下面還有一個(gè)是橡皮擦喜歡做的事情,就是打開(kāi)購(gòu)物網(wǎng)站,搜一下看看有沒(méi)有好書(shū)。
看了一下,并沒(méi)有特別想買(mǎi)的,你可以直接去當(dāng)當(dāng)網(wǎng)查看一下評(píng)分和書(shū)評(píng),找一找有沒(méi)有自己喜歡的書(shū),不過(guò)一般不建議直接購(gòu)買(mǎi),有些書(shū)還是比較坑的,可以先搞一本電子版的看看,如果覺(jué)得內(nèi)容好,再去購(gòu)買(mǎi)一本實(shí)體的書(shū)籍。
注意參考資料時(shí)間距離現(xiàn)在越近越好,而且一定要看原版博客的內(nèi)容,別看轉(zhuǎn)載的,轉(zhuǎn)載的格式很容易混亂。
查找原版博客,可以復(fù)制文章標(biāo)題在搜索引擎查找,很容易找到。
橡皮擦最后選擇的還是上文提及的搜索引擎排第一的博主,畢竟他是去年發(fā)布的文章,閱讀量還可以。
1 個(gè)小時(shí)剩余的時(shí)間不多了,接下來(lái)先把 OpenCV 安裝上再說(shuō),使用 pip install opencv-python 安裝即可,安裝包還挺大的,30 多 M。
安裝完畢先試試手,看看這個(gè)庫(kù)怎么用。
import cv2 img = cv2.imread("./test_img.jpg") cv2.imshow("img",img)
運(yùn)行代碼發(fā)現(xiàn)圖片一閃而過(guò),奇怪,核對(duì)參考博文代碼發(fā)現(xiàn),還需要設(shè)置一個(gè)等待條件,當(dāng)按下某些固定按鍵的時(shí)候,關(guān)閉窗口。
import cv2 img = cv2.imread("./test_img.jpg") cv2.imshow("img", img) key = cv2.waitKey(0) # 按 esc 鍵時(shí),關(guān)閉所有窗口 if key == 27: print(key) cv2.destroyAllWindows()
先記錄兩個(gè)方法,別求太細(xì)致,先弄懂基本使用規(guī)則即可。
cv2.imread()
讀取圖片,關(guān)于其它參數(shù),可以使用 help(cv2.imread) 獲取。只有一個(gè)必填參數(shù)。
imread(img_path[,flags]) 讀取圖片,返回圖片對(duì)象
img_path: 圖片的路徑,即使路徑錯(cuò)誤也不會(huì)報(bào)錯(cuò),但打印返回的圖片對(duì)象為 None
flags:
cv2.IMREAD_COLOR,讀取彩色圖片,圖片透明性會(huì)被忽略,為默認(rèn)參數(shù),也可以傳入 1
cv2.IMREAD_GRAYSCALE,按灰度模式讀取圖像,也可以傳入 0
cv2.IMREAD_UNCHANGED,讀取圖像,包括其 alpha 通道,也可以傳入-1
除了圖片路徑先掌握以外,其它的先放著,什么彩色圖片,灰度圖像,alpha 通道,都通通不管,后文咱們可以每個(gè)參數(shù)都實(shí)驗(yàn)一下。
最后在看一下圖片對(duì)象是什么類(lèi)型的。
import cv2 img = cv2.imread("./test_img.jpg") # help(cv2.imread) print(type(img))
有點(diǎn)意思,輸出的是
cv2.imshow()
顯示圖片,從博文中學(xué)到的內(nèi)容如下:
imshow(window_name,img):顯示圖片,窗口自適應(yīng)圖片大小
window_name: 指定窗口的名字
img:顯示的圖片對(duì)象
可以指定多個(gè)窗口名稱(chēng),顯示多個(gè)圖片
檢索資料發(fā)現(xiàn) imshow 就是 image show 的縮寫(xiě),貌似已經(jīng)猜到了,還有 imshow 一般用在開(kāi)發(fā)測(cè)試中,在實(shí)際的場(chǎng)景中都是使用第三方的 UI 控件去顯示圖像。
最后一點(diǎn)需要注意的是:imshow 之后必須有 waitKey 函數(shù),否則顯示窗內(nèi)將一閃而過(guò),不會(huì)駐留屏幕。
waitKey(millseconds) 鍵盤(pán)綁定事件,阻塞監(jiān)聽(tīng)鍵盤(pán)按鍵,返回一個(gè)數(shù)字(不同按鍵對(duì)應(yīng)的數(shù)字不同) millseconds: 傳入時(shí)間毫秒數(shù),在該時(shí)間內(nèi)等待鍵盤(pán)事件;傳入 0 時(shí),會(huì)一直等待鍵盤(pán)事件 destroyAllWindows(window_name) window_name: 需要關(guān)閉的窗口名字,不傳入時(shí)關(guān)閉所有窗口
方法的簡(jiǎn)單使用已經(jīng)掌握了,接下來(lái)就要針對(duì)性的學(xué)習(xí)了,先看一下 imread 方法,找到官方手冊(cè)。
https://docs.opencv.org/4.4.0/d4/da8/group__imgcodecs.html#ga288b8b3da0892bd651fce07b3bbd3a56
使用方法和注意事項(xiàng)寫(xiě)的清清楚楚,不過(guò)是英文的。
參數(shù)說(shuō)明如下:
filename Name of file to be loaded.
flags Flag that can take values of cv::ImreadModes
可選參數(shù)為枚舉值:https://docs.opencv.org/4.4.0/d4/da8/group__imgcodecs.html#ga61d9b0126a3e57d9277ac48327799c80
隨意修改一下,因?yàn)樯衔奶峒傲水?dāng)按灰度模式讀取圖像時(shí),設(shè)置為 0。學(xué)習(xí)效果可直接設(shè)置為 0 ,嘗試一下,結(jié)果得到一個(gè)黑白圖片。
import cv2 img = cv2.imread("./test_img.jpg", 0) cv2.imshow("第一個(gè)窗口", img) key = cv2.waitKey(0) # 按 esc 鍵時(shí),關(guān)閉所有窗口 if key == 27: print(key) cv2.destroyAllWindows()
發(fā)現(xiàn)上文彈出的窗口亂碼了,也就是說(shuō) imshow 第一個(gè)參數(shù)設(shè)置為中文會(huì)出現(xiàn)亂碼,如何修改可以直接進(jìn)行簡(jiǎn)單,但是檢索之后還是建議你使用英文吧。因?yàn)闄z索了一下并無(wú)好的解決方案,網(wǎng)上提及的答案是:由于在 OpenCV-Python 包中,imshow 函數(shù)的窗口標(biāo)題是 gbk 編碼,而 Python3 默認(rèn) UTF-8 編碼。但是并不能解決。
本部分結(jié)束之后,對(duì)于 retval = cv.waitKey([, delay]) 方法,是 imshow 方法要求的,如下圖所示。
注意按下鍵盤(pán) Ctrl+C 復(fù)制的時(shí)候,窗口自動(dòng)關(guān)閉。
可以直接在 cv.waitKey 方法中設(shè)置等待 10 秒自動(dòng)關(guān)閉,代碼為 cv2.waitKey(10000)。
destroyAllWindows 方法,沒(méi)有什么要說(shuō)的,關(guān)閉窗口。
今天的 OpenCV 尾聲
本篇博客主要介紹了一下本系列內(nèi)容的書(shū)寫(xiě)背景,同時(shí)配置了一下基本的環(huán)境,案例很簡(jiǎn)單,希望這整個(gè)學(xué)習(xí)過(guò)程能對(duì)你產(chǎn)生幫助。
如果你想跟博主建立親密關(guān)系,可以關(guān)注同名公眾號(hào)
夢(mèng)想橡皮擦
,近距離接觸一個(gè)逗趣的互聯(lián)網(wǎng)高級(jí)網(wǎng)蟲(chóng)。
博主 ID:夢(mèng)想橡皮擦,希望大家
、
評(píng)論
、
。
OpenCV Python
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶(hù)投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。