python 影象處理:一福變五福
快過年了,各種網際網路產品都出來撒紅包。某寶一年一度的集五福(shua hou)活動更是成為每年的必備活動。雖然到最後每人大概也就分個兩塊錢,但作為一個全民話題,大多數人還是願意湊湊熱鬧。畢竟對於如今生活在大城市的人來說,集福領紅包和空蕩的地鐵車廂或許已是最大的“年味”了。
既然是湊熱鬧,怎麼能少得了我。前年過年發過一篇:《 一行程式碼掃出“敬業福” 》,介紹的是 OCR 文字識別 的使用。今年再來對“福”字做文章,演示下如何 用 python 的影象處理功能,把一幅“福”字圖片轉出 5 種不同的效果 :
python 最影象處理最常用的兩個模組是 PIL 和 OpenCV ,這裡我們選擇 OpenCV。
讀取圖片及展示程式碼:
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 展示和儲存圖片則不需要。
上面的效果分別用到了以下功能:
1、灰度福
這裡沒有選擇直接將圖片轉出灰度圖,因為這樣會導致福字不明顯。而是通過將 紅、綠、藍三通道分離 後,選擇色差最大的紅色通道。
r,g,b = cv2.split(img)
2、輪廓福
使用了 OpenCV 自帶的 影象輪廓提取 功能。為了更好的效果,這裡 對紅色通道進行二值化 後,再查詢輪廓。
_, 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)
3、反色福
髮色的實現是將每個畫素值 x
轉成 255-x
。如果遍歷畫素計算會比較慢,於是用了一個小技巧: 轉成 numpy 的 ndarray 再進行矩陣運算 。
img_i = np.asarray(img) img_i = 255 - img_i
4、膨脹福
這裡其實是“ 影象腐蝕 ”操作(與“ 影象膨脹 ”操作相反)。因為在我們選取的紅色通道中,白色是背景,黑色才是福字,所以對白色的“腐蝕”也就是對黑色的“膨脹”。這也是 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)]
5、福到了
OpenCV 提供了 翻轉 操作,第二個引數是 旋轉軸 的選取,你可以試試 0 和 1 的效果。
img_r = cv2.flip(img, -1)
完整程式碼可以在公眾號( Crossin的程式設計教室 )裡回覆關鍵字: 五福
以上就是我送給大家的 5 個福。試過了,都能被掃出來。我已集齊
如果你還沒湊齊,可以掃這個圖。祝大家新年有福氣!
════