参考文章:
剪裁: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
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)
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/