程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

20行代碼教你用python給證件照換底色

編輯:Python


本文只是一種實現思路,當然PS很好用,希望大家能夠學習更多的知識,才分享了這個文章。更多精彩,請關注公眾號:【數據分析與統計學之美】

1.圖片來源


2.讀取圖片並顯示

  • imread():讀取圖片;
  • imshow():展示圖片;
  • waitkey():設置窗口等待,如果不設置,窗口會一閃而過;
import
cv2

import numpy as np
# 讀取照片
img = cv2. imread( 'girl.jpg')

# 顯示圖像
cv2. imshow( 'img', img)

# 窗口等待的命令,0表示無限等待
cv2. waitKey( 0)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.

效果如下:

3.圖片縮放

  • resize():圖片縮放,其中fx和fy表示縮放比例,0.5表示縮放為以前的 一半。
import
cv2

import numpy as np
# 讀取照片
img = cv2. imread( 'girl.jpg')

# 圖像縮放
img = cv2. resize( img, None, fx = 0.5, fy = 0.5)
rows, cols, channels = img. shape
print( rows, cols, channels)

# 顯示圖像
cv2. imshow( 'img', img)

# 窗口等待的命令,0表示無限等待
cv2. waitKey( 0)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.

結果如下:

4.將圖片轉換為灰度圖像

三色圖片有RGB三個顏色通道,無法進行腐蝕和膨脹的操作。這個就需要我們將彩色圖片轉換為hsv灰度圖像後,再完成腐蝕和膨脹的操作。

  • cv2.cvtColor(img,cv2.COLOR_BGR2HSV)可以將彩色圖片轉化為hsv灰度圖片。
import
cv2

import numpy as np
# 讀取照片
img = cv2. imread( 'girl.jpg')

# 圖像縮放
img = cv2. resize( img, None, fx = 0.5, fy = 0.5)
rows, cols, channels = img. shape
print( rows, cols, channels)
cv2. imshow( 'img', img)

# 圖片轉換為二值化圖
hsv = cv2. cvtColor( img, cv2. COLOR_BGR2HSV)

# 顯示圖像
cv2. imshow( 'hsv', hsv)

# 窗口等待的命令,0表示無限等待
cv2. waitKey( 0)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.

結果如下:

5.將圖片進行二值化處理

二值化處理是為了將圖片轉換為黑白圖片。二值化類似於1表示男、2表示女,對於圖像的處理我們也需要自定義一個最小值和最大值,這裡分別用lower_blue和upper_blue表示

  • lower_blue = np.array([90,70,70])
  • upper_blue = np.array([110,255,255])
  • inRange(hsv, lower_blue, upper_blue)將圖片進行二值化操作。
import
cv2

import numpy as np
# 讀取照片
img = cv2. imread( 'girl.jpg')

# 圖像縮放
img = cv2. resize( img, None, fx = 0.5, fy = 0.5)
rows, cols, channels = img. shape
print( rows, cols, channels)
cv2. imshow( 'img', img)

# 圖片轉換為灰度圖
hsv = cv2. cvtColor( img, cv2. COLOR_BGR2HSV)
cv2. imshow( 'hsv', hsv)

# 圖片的二值化處理
lower_blue = np. array([ 90, 70, 70])
upper_blue = np. array([ 110, 255, 255])
mask = cv2. inRange( hsv, lower_blue, upper_blue)


# 顯示圖像
cv2. imshow( 'mask', mask)

# 窗口等待的命令,0表示無限等待
cv2. waitKey( 0)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.

結果如下:


缺點:我們觀察第三章圖片,發現黑色區域有時候會出現一些噪聲(白點),這裡可能顯示的不是很明顯,有的圖片顯示的很明顯,這就需要我們進行腐蝕或膨脹。

6.圖象的腐蝕和膨脹

上面的圖象進行二值化後,出現了一些噪聲,我們可以采用腐蝕或膨脹進行圖片的處理,觀察哪種的處理效果好一些。

  • erode(mask,None,iterations=1)進行腐蝕操作。
  • dilate(erode,None,iterations=1)進行膨脹操作。
import
cv2

import numpy as np
# 讀取照片
img = cv2. imread( 'girl.jpg')

# 圖像縮放
img = cv2. resize( img, None, fx = 0.5, fy = 0.5)
rows, cols, channels = img. shape
print( rows, cols, channels)
cv2. imshow( 'img', img)

# 圖片轉換為灰度圖
hsv = cv2. cvtColor( img, cv2. COLOR_BGR2HSV)
cv2. imshow( 'hsv', hsv)

# 圖片的二值化處理
lower_blue = np. array([ 90, 70, 70])
upper_blue = np. array([ 110, 255, 255])
mask = cv2. inRange( hsv, lower_blue, upper_blue)


#腐蝕膨脹
erode = cv2. erode( mask, None, iterations = 1)
cv2. imshow( 'erode', erode)

dilate = cv2. dilate( erode, None, iterations = 1)
cv2. imshow( 'dilate', dilate)


# 窗口等待的命令,0表示無限等待
cv2. waitKey( 0)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.

結果如下:


觀察上圖:對於這個圖片,無論是腐蝕或膨脹,都起到了很好的去圖片噪聲的操作,我們使用腐蝕後的圖片也可以,我們使用膨脹後的圖片也可以。

7.遍歷每個像素點進行顏色替換

圖片是由每一個像素點組成的,我們就是要找到腐蝕後得到圖片的,白色底色處的像素點,然後將原圖中對應位置處的像素點,替換為紅色。

import
cv2

import numpy as np
# 讀取照片
img = cv2. imread( 'girl.jpg')

# 圖像縮放
img = cv2. resize( img, None, fx = 0.5, fy = 0.5)
rows, cols, channels = img. shape
print( rows, cols, channels)
cv2. imshow( 'img', img)

# 圖片轉換為灰度圖
hsv = cv2. cvtColor( img, cv2. COLOR_BGR2HSV)
cv2. imshow( 'hsv', hsv)

# 圖片的二值化處理
lower_blue = np. array([ 90, 70, 70])
upper_blue = np. array([ 110, 255, 255])
mask = cv2. inRange( hsv, lower_blue, upper_blue)


#腐蝕膨脹
erode = cv2. erode( mask, None, iterations = 1)
cv2. imshow( 'erode', erode)

dilate = cv2. dilate( erode, None, iterations = 1)
cv2. imshow( 'dilate', dilate)

#遍歷替換
for i in range( rows):
for j in range( cols):
if erode[ i, j] == 255: # 像素點為255表示的是白色,我們就是要將白色處的像素點,替換為紅色
img[ i, j] =( 0, 0, 255) # 此處替換顏色,為BGR通道,不是RGB通道
cv2. imshow( 'res', img)

# 窗口等待的命令,0表示無限等待
cv2. waitKey( 0)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.

效果如下:





  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved