快過年了,,各種互聯(lián)網(wǎng)產(chǎn)品都出來撒紅包,。某寶一年一度的集五福(shua hou)活動(dòng)更是成為每年的必備活動(dòng)。雖然到最后每人大概也就分個(gè)兩塊錢,,但作為一個(gè)全民話題,,大多數(shù)人還是愿意湊湊熱鬧,。畢竟對(duì)于如今生活在大城市的人來說,,集福領(lǐng)紅包和空蕩的地鐵車廂或許已是最大的“年味”了。 既然是湊熱鬧,,怎么能少得了我,。前年過年我發(fā)過一篇:《一行代碼掃出“敬業(yè)福”》,,介紹的是 OCR 文字識(shí)別的使用,。今年再來對(duì)“福”字做文章,,演示下如何用 python 的圖像處理功能,,把一幅“福”字圖片轉(zhuǎn)出 5 種不同的效果: python 最圖像處理最常用的兩個(gè)模塊是 PIL 和 OpenCV,,這里我們選擇 OpenCV,。 讀取圖片及展示代碼: import cv2 因?yàn)?OpenCV 和 matplotlib 的顏色模式不一樣,,所以需要做一次轉(zhuǎn)換,,如果是直接通過 cv2 展示和保存圖片則不需要。 上面的效果分別用到了以下功能: 1,、灰度福 這里沒有選擇直接將圖片轉(zhuǎn)出灰度圖,,因?yàn)檫@樣會(huì)導(dǎo)致福字不明顯。而是通過將紅,、綠,、藍(lán)三通道分離后,選擇色差最大的紅色通道,。 r,g,b = cv2.split(img) 2,、輪廓福 使用了 OpenCV 自帶的圖像輪廓提取功能。為了更好的效果,,這里對(duì)紅色通道進(jìn)行二值化后,,再查找輪廓。 _, 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,、反色福 發(fā)色的實(shí)現(xiàn)是將每個(gè)像素值 img_i = np.asarray(img)
img_i = 255 - img_i 4,、膨脹福 這里其實(shí)是“圖像腐蝕”操作(與“圖像膨脹”操作相反),。因?yàn)樵谖覀冞x取的紅色通道中,白色是背景,,黑色才是福字,,所以對(duì)白色的“腐蝕”也就是對(duì)黑色的“膨脹”。這也是 OpenCV 的內(nèi)置功能,。做完這一步,,又對(duì)圖像進(jìn)行了切割,直接通過列表的切片操作實(shí)現(xiàn),。 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 提供了翻轉(zhuǎn)操作,第二個(gè)參數(shù)是旋轉(zhuǎn)軸的選取,,你可以試試 0 和 1 的效果,。 img_r = cv2.flip(img, -1) 完整代碼可以在公眾號(hào)(Crossin的編程教室)里回復(fù)關(guān)鍵字:五福 以上就是我送給大家的 5 個(gè)福。試過了,,都能被掃出來,。我已集齊 如果你還沒湊齊,可以掃這個(gè)圖,。祝大家新年有福氣,! |
|