快過年了,各類互聯網產品都出來撒紅包。某寶一年一度的集五福(shua hou)活動更是成爲每一年的必備活動。雖然到最後每人大概也就分個兩塊錢,但做爲一個全民話題,大多數人仍是願意湊湊熱鬧。畢竟對於現在生活在大城市的人來講,集福領紅包和空蕩的地鐵車箱或許已經是最大的「年味」了。python
既然是湊熱鬧,怎麼能少得了我。前年過年發過一篇:《一行代碼掃出「敬業福」》,介紹的是 OCR 文字識別 的使用。今年再來對「福」字作文章,演示下如何 用 python 的圖像處理功能,把一幅「福」字圖片轉出 5 種不一樣的效果 :編程
python 最圖像處理最經常使用的兩個模塊是 PIL 和 OpenCV ,這裏咱們選擇 OpenCV。ui
讀取圖片及展現代碼:人工智能
import cv2 from matplotlib import pyplot as plt img = cv2.imread('fu.png') # 轉換顏色模式,顯示原圖 img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) plt.imshow(img) plt.show()
由於 OpenCV 和 matplotlib 的 顏色模式 不同,因此須要作一次轉換,若是是直接經過 cv2 展現和保存圖片則不須要。spa
上面的效果分別用到了如下功能:code
一、灰度福blog
這裏沒有選擇直接將圖片轉出灰度圖,由於這樣會致使福字不明顯。而是經過將 紅、綠、藍三通道分離 後,選擇色差最大的紅色通道。圖片
r,g,b = cv2.split(img)
二、輪廓福ip
使用了 OpenCV 自帶的 圖像輪廓提取 功能。爲了更好的效果,這裏 對紅色通道進行二值化 後,再查找輪廓。rem
_, img_bin = cv2.threshold(r, 50, 255, cv2.THRESH_BINARY) _, contours, _ = cv2.findContours(img_bin, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) img_cont = np.zeros(img_bin.shape, np.uint8) cv2.drawContours(img_cont, contours, -1, 255, 3)
三、反色福
髮色的實現是將每一個像素值 x
轉成 255-x
。若是遍歷像素計算會比較慢,因而用了一個小技巧: 轉成 numpy 的 ndarray 再進行矩陣運算 。
img_i = np.asarray(img) img_i = 255 - img_i
四、膨脹福
這裏實際上是「 圖像腐蝕 」操做(與「 圖像膨脹 」操做相反)。由於在咱們選取的紅色通道中,白色是背景,黑色纔是福字,因此對白色的「腐蝕」也就是對黑色的「膨脹」。這也是 OpenCV 的內置功能。作完這一步,又對圖像進行了切割,直接經過列表的切片操做實現。
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(25, 25)) eroded = cv2.erode(r, kernel) size = img.shape eroded = eroded[int(size[1]*0.15):int(size[1]*0.7),int(size[0]*0.2):int(size[0]*0.85)]
五、福到了
OpenCV 提供了 翻轉 操做,第二個參數是 旋轉軸 的選取,你能夠試試 0 和 1 的效果。
img_r = cv2.flip(img, -1)
完整代碼能夠在公衆號( Crossin的編程教室 )裏回覆關鍵字: 五福
以上就是我送給你們的 5 個福。試過了,都能被掃出來。我已集齊
若是你還沒湊齊,能夠掃這個圖。祝你們新年有福氣!
════
其餘文章及回答:
如何自學Python | 新手引導 | 精選Python問答 | Python單詞表 | 人工智能 | 爬蟲 | 我用Python | requests | 計算機視覺 | 字符播放器 | 一圖學Python | 智能防擋彈幕
歡迎搜索及關注公衆號: Crossin的編程教室