python学习 python实现证件照剪裁、缩放、修改底色

参考文章:

剪裁:https://blog.csdn.net/hfutdog/article/details/82351549

 Background:学校要求上传电子证件照,大小为538*441像素,白底。这个尺寸实在是奇怪,我的照片大小是1080*1512像素,蓝底,于是我打算学习用python处理。

一、调整大小

既要调整比例又要缩放的要求还是有些复杂,感觉不能直接完成,于是我直接自己计算需要剪裁的像素值了。有两种方法:

1、通过Pillow

pip install image

2、通过OpenCV

pip install opencv-python

1、Pillow

from PIL import Image

infile = 'D:\\zhengjianzhao.jpg'
outfile = 'D:\\myphoto.jpg'

img = Image.open(infile)#读取图片
(x,y) = img.size #read image size
print( 'original size: ',x,y)#打印图片原始尺寸(1080*1512)
cutX=0.5*(x-1074)#1074=358*3
cutY=0.5*(y-1323)
print('cutX=',cutX,' cutY=',cutY)
img_cropped = img.crop((cutX,cutY,x-cutX,y-cutY))  # (left, upper, right, lower)
x_s = 358 #define standard width
y_s = 441 #calc height based on standard width
print('new size:',x_s,y_s)
out =img_cropped .resize((x_s,y_s),Image.ANTIALIAS) #resize image with high-quality
out.save(outfile)

2、OpenCV


import cv2
from math import floor

infile = 'D:\\zhengjianzhao.jpg'
outfile = 'D:\\myphotocv.jpg'
img = cv2.imread(infile)
y,x=img.shape[0:2]#0垂直尺度,1水平尺寸,2通道数
cv2.imshow('OriginalPicture:',img)#显示原图

cutX=int(0.5*(x-1074))#1074=358*3
cutY=floor(0.5*(y-1323))#不支持小数
img_cropped = img[cutY:y-cutY,cutX:x-cutX]# 裁剪坐标为[y0:y1, x0:x1]
y1,x1=img_cropped.shape[0:2]#剪裁后的尺寸

img_test=cv2.resize(img_cropped,(int(x1/3),int(y1/3)))#缩放
cv2.imshow('resize:', img_test)
cv2.waitKey()#程序显示出图片后将暂停,等待接收一个键盘输入

cv2.imwrite(outfile, img_test)
cv2.waitKey()
cv2.destroyAllWindows()#关闭特定窗口
print('original size:',x,y)
print('Cropped size:',x1,y1)
print('new size:',int(x1/3),int(y1/3))

可以看出来opencv的剪裁方法img[]的参数不能是小数,所以我取了floor。获取图片尺寸时的参数顺序也不一致。

二、修改底色

import cv2
import numpy as np
from math import floor

infile = 'D:\\bluebackground.jpg'
outfile = 'D:\\changebackground.jpg'
 
orimg=cv2.imread(infile)
rows,cols,channels = orimg.shape
cv2.imshow('original img',orimg)

#剪裁缩放
cutX=int(0.5*(cols-1074))#1074=358*3
cutY=floor(0.5*(rows-1323))#不支持小数
img_cropped = orimg[cutY:rows-cutY,cutX:cols-cutX]# 裁剪坐标为[y0:y1, x0:x1]
y1,x1=img_cropped.shape[0:2]#剪裁后的尺寸

img=cv2.resize(img_cropped,(int(x1/3),int(y1/3)))#缩放
cv2.imshow('resize:', img)
cv2.waitKey()#程序显示出图片后将暂停,等待接收一个键盘输入
cv2.destroyAllWindows()#关闭特定窗口

#转换hsv
hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)#色调(H),饱和度(S),明度(V)
lower_blue=np.array([90,70,70])
upper_blue=np.array([110,255,255])

#将hsv值位于区间[lower_blue,upper_blue]的部分置为255(白),位于区间外的部分置为0(黑)
mask = cv2.inRange(hsv, lower_blue, upper_blue)#黑白图像
cv2.imshow('Mask', mask)
 
#腐蚀膨胀,去掉目标外的孤立点
erode=cv2.erode(mask,None,iterations=1)
cv2.imshow('erode',erode)
dilate=cv2.dilate(erode,None,iterations=1)
cv2.imshow('dilate',dilate)


#遍历替换
x2,y2 = dilate.shape[0:2]
for i in range(x2):
  for j in range(y2):
    if dilate[i,j]==255:#背景部分为255(白)
      #img[i,j]=(0,0,255)#此处替换颜色,为BGR通道
      img[i,j]=(255,255,255)
cv2.imshow('res',img)
 
cv2.waitKey(0)
cv2.destroyAllWindows()

就不放图片啦。

这里有一个查颜色的网址:https://www.fontke.com/tool/rgb/010001/

你可能感兴趣的:(计算机视觉,python基础)