python图像处理:一福变五福

快过年了,各类互联网产品都出来撒红包。某宝一年一度的“集五福活动”更是成为每一年的必备活动之一。python

虽然到最后每人大概也就分个两块钱,但做为一个全民话题,大多数人仍是愿意凑凑热闹。app

毕竟对于现在生活在大城市的人来讲,集福领红包和空荡的地铁车箱或许已经是最大的“年味”了。ui

 

spa

既然是凑热闹,怎么能少得了我。code

以前我(GitPython公众号)发过一篇:《10几行代码,用python打造实时截图识别OCR》,介绍的是OCR文字识别的使用。blog

 

本篇文章再来对“福”字作文章,演示下如何用python图像处理功能,把一幅“福”字图片转出 5 种不一样的效果:图片

 

python最图像处理最经常使用的两个模块是PIL和OpenCV,这里咱们选择 OpenCV。ip

读取图片及展现代码:element

 

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 展现和保存图片则不须要。get

 

上面的效果分别用到了如下功能:

 

01

灰度福

 

这里没有选择直接将图片转出灰度图,由于这样会致使福字不明显。而是经过将红、绿、蓝三通道分离后,选择色差最大的红色通道。

 

r,g,b = cv2.split(img)

 

02

轮廓福

 

使用了 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)

 

03

反色福

 

发色的实现是将每一个像素值 x 转成 255-x。若是遍历像素计算会比较慢,因而用了一个小技巧:转成numpy的ndarray再进行矩阵运算。

 

img_i = np.asarray(img)
img_i = 255 - img_i

 

04

膨胀福

 

这里实际上是“图像腐蚀”操做(与“图像膨胀”操做相反)。由于在咱们选取的红色通道中,白色是背景,黑色才是福字,因此对白色的“腐蚀”也就是对黑色的“膨胀”。这也是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)]

 

05

福到了

 

OpenCV 提供了翻转操做,第二个参数是旋转轴的选取,你能够试试 0 和 1 的效果。

 

img_r = cv2.flip(img, -1)
相关文章
相关标签/搜索