├── .gitignore ├── .python-version ├── CoreImage.py ├── README.md ├── newImage ├── new_face.jpg └── new_image.jpg └── originalImage ├── face.jpg └── image.jpg /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | .DS_Store 3 | -------------------------------------------------------------------------------- /.python-version: -------------------------------------------------------------------------------- 1 | 3.4.3 2 | -------------------------------------------------------------------------------- /CoreImage.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # @Author: haodaquan 3 | # @Date: 2016-12-25 10:13:57 4 | # @Last Modified by: haodaquan 5 | # @Last Modified time: 2016-12-30 16:50:36 6 | import sys 7 | import copy 8 | import cv2 9 | import math 10 | import datetime 11 | 12 | #---------------------------------------------------------------------- 13 | # CoreImage: 核心图片类,获取核心图片 14 | #---------------------------------------------------------------------- 15 | class CoreImage(object): 16 | #imageInfo = [imageName,imagePath,newImagePath] 17 | def __init__(self,*arg): 18 | imgInfo = arg[0] 19 | cropInfo = arg[1] 20 | #原图信息 21 | self.imgPath = imgInfo.get('imgPath','./originalImage/') 22 | self.imgName = imgInfo.get('imgName','image.jpg') 23 | 24 | #新图信息 25 | self.newImgPath = cropInfo.get('newImgPath','./newImage/') 26 | self.isBgPure = cropInfo.get('isBgPure',0)#是否纯色背景,0-不是,1-是 27 | self.newWidth = cropInfo.get('newWidth',380) 28 | self.newHeight = cropInfo.get('newHeight',380) 29 | self.line = cropInfo.get('line',1) #每隔几行扫描一次,建议1,4,8 30 | 31 | 32 | #获取图片边缘 33 | def getImgEdge(self): 34 | img = cv2.imread(self.imgPath+self.imgName) 35 | edge = cv2.Canny(img,100,300) #可以根据实际业务进行调整 36 | # cv2.imwrite(self.newImgPath+'edge.jpg',edge) 37 | return [edge,img] 38 | 39 | #获取核心图片 40 | def getCoreImg(self): 41 | if(self.isBgPure==1): 42 | return self.getPureBgCoreImg() 43 | else: 44 | return self.getDefaultBgCoreImg() 45 | 46 | #获取纯色背景核心图片 47 | def getPureBgCoreImg(self): 48 | 49 | begin = datetime.datetime.now() 50 | edgeImg = self.getImgEdge() 51 | img_width = edgeImg[1].shape[1] 52 | img_height = edgeImg[1].shape[0] 53 | x0 = 0 # 左上角x 54 | y0 = 0 # 左上角y 55 | x1 = img_width-1 56 | y1 = img_height-1 57 | 58 | #左上角X轴 59 | i = j = 0 60 | for i in range(0,img_width,self.line): 61 | if(x0!=0): 62 | break; 63 | for j in range(0,img_height): 64 | if(edgeImg[0][j,i]!=0): 65 | x0=i-self.line 66 | break 67 | #左上角Y轴 68 | i = j = 0 69 | for i in range(0,img_height,self.line): 70 | if(y0!=0): 71 | break; 72 | for j in range(0,img_width): 73 | if(edgeImg[0][i,j]!=0): 74 | y0=i-self.line 75 | break 76 | #右下角X轴 77 | i = j = 0 78 | for i in range(0,img_width,self.line)[::-1]: 79 | if(x1!=img_width-1): 80 | break; 81 | for j in range(0,img_height)[::-1]: 82 | if(edgeImg[0][j,i]!=0): 83 | x1=i+self.line 84 | break 85 | #右下角Y轴 86 | i = j = 0 87 | for i in range(0,img_height,self.line)[::-1]: 88 | if(y1!=img_height-1): 89 | break; 90 | for j in range(0,img_width)[::-1]: 91 | if(edgeImg[0][i,j]!=0): 92 | y1=i+self.line 93 | break 94 | 95 | crop_img = edgeImg[1][y0:y1,x0:x1] 96 | # image_name = 'new_image'+str(self.line)+'.jpg' 97 | image_name = 'new_image.jpg' 98 | cv2.imwrite(self.newImgPath+image_name,crop_img) 99 | end = datetime.datetime.now() 100 | print(end-begin); 101 | return crop_img 102 | 103 | #获取默认的核心图片 含人脸识别 104 | def getDefaultBgCoreImg(self): 105 | # 加载训练好的脸、眼分类器 106 | face_cascade = cv2.CascadeClassifier( 107 | '/usr/local/share/OpenCV/haarcascades/haarcascade_frontalface_alt.xml') 108 | eye_cascade = cv2.CascadeClassifier( 109 | '/usr/local/share/OpenCV/haarcascades/haarcascade_eye.xml') 110 | 111 | width = self.newWidth 112 | height = self.newHeight 113 | 114 | img = cv2.imread(self.imgPath+self.imgName) 115 | # 返回 img 的浅拷贝 116 | original = copy.copy(img) 117 | # 转换为灰度图 118 | gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 119 | # 检测人脸 120 | faces = face_cascade.detectMultiScale( 121 | gray, 122 | scaleFactor=1.1, 123 | minNeighbors=5, 124 | minSize=(30, 30), 125 | flags=cv2.CASCADE_SCALE_IMAGE) 126 | 127 | imHeight, imWidth = img.shape[:2] 128 | maxFaceCenter = 0 129 | maxFaceRight = 0 130 | maxFaceMidlle = 0 131 | 132 | for (x, y, w, h) in faces: 133 | # 人脸部分用实心矩形框选 134 | cv2.rectangle(img, (x, y), (x + w, y + h), (255, 255, 255), -1) 135 | # cropBias = cropBias - x 136 | # 找出最大人脸 137 | if (x + w) > maxFaceRight: 138 | maxFaceCenter = (x + w) - (w // 2) 139 | maxFaceRight = x + w 140 | maxFaceMidlle = y + h // 2 141 | # 截出人脸 142 | roi_gray = gray[y:y + h, x:x + w] 143 | roi_color = img[y:y + h, x:x + w] 144 | # 检测眼睛 145 | eyes = eye_cascade.detectMultiScale(roi_gray) 146 | # 框选出人眼 147 | for (ex, ey, ew, eh) in eyes: 148 | cv2.rectangle(roi_color, (ex, ey), (ex + ew, ey + eh), (0, 255, 0),2) 149 | 150 | #左上角位置定位 151 | leftPosX = maxFaceCenter - width // 2 152 | leftPosY = maxFaceMidlle - height // 2 153 | if(leftPosX < 0): 154 | leftPosX = 0 155 | if(leftPosY < 0): 156 | leftPosY = 0 157 | # print(leftPosY,height, leftPosX,width) 158 | copyX = width + leftPosX 159 | copyY = height + leftPosY 160 | 161 | if(copyX < maxFaceRight): 162 | copyX = maxFaceRight 163 | 164 | # print(leftPosY,copyY, leftPosX,copyX) 165 | croppedData = original[leftPosY:copyY, leftPosX:copyX] 166 | croppedName = self.newImgPath+"new_face.jpg" 167 | cv2.imwrite(croppedName, croppedData) 168 | 169 | if __name__ == '__main__': 170 | imgPath = './originalImage/' 171 | newImgPath = './newImage/' 172 | 173 | #人脸识别 174 | imgName = 'face.jpg' 175 | imgInfo = {'imgName':imgName,'imgPath':imgPath} 176 | newImgInfo = {'isBgPure':0,'newWidth':280,'newHeight':280}; 177 | coeImg = CoreImage(imgInfo,newImgInfo) 178 | coeImg.getCoreImg(); 179 | 180 | 181 | 182 | #背景纯色图 183 | imgName = 'image.jpg' 184 | imgInfo = {'imgName':imgName,'imgPath':imgPath} 185 | newImgInfo = {'isBgPure':1,'line':8}; 186 | 187 | coeImg = CoreImage(imgInfo,newImgInfo) 188 | coeImg.getCoreImg(); 189 | 190 | 191 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # CoreImage 裁剪核心图片 2 |
3 | ##作用 4 | 核心图片:是指一张图片中最重要的部分。
5 | 目前适用于纯色背景图片截取和人物图片剪切
6 | 7 | ##效果展示 8 | 人物原图
9 | ![github](https://github.com/george518/CoreImage/blob/master/originalImage/face.jpg?raw=true "github") 10 |

11 | 截取280*280大小大图片。效果如下:
12 | ![github](https://github.com/george518/CoreImage/blob/master/newImage/new_face.jpg?raw=true "github") 13 |

14 | 纯背景图片
15 | ![github](https://github.com/george518/CoreImage/blob/master/originalImage/image.jpg?raw=true "github") 16 |

17 | 去除背景。效果如下:
18 | ![github](https://github.com/george518/CoreImage/blob/master/newImage/new_image.jpg?raw=true "github") 19 |
20 | 21 | ##环境 22 | python3.4.3
23 | openCv3.1.0
24 | 25 | ##Mac安装过程 26 | brew install opencv3 --with-python3
27 | brew unlink opencv
28 | brew ln opencv3 --force
29 | ln -s /usr/local/Cellar/opencv/2.4.12_2/lib/python2.7/site-packages/cv2.so cv2.so
30 | 31 | -------------------------------------------------------------------------------- /newImage/new_face.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/george518/CoreImage/670e8f30a4771943354a62fd6d3f49241f4b5aa3/newImage/new_face.jpg -------------------------------------------------------------------------------- /newImage/new_image.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/george518/CoreImage/670e8f30a4771943354a62fd6d3f49241f4b5aa3/newImage/new_image.jpg -------------------------------------------------------------------------------- /originalImage/face.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/george518/CoreImage/670e8f30a4771943354a62fd6d3f49241f4b5aa3/originalImage/face.jpg -------------------------------------------------------------------------------- /originalImage/image.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/george518/CoreImage/670e8f30a4771943354a62fd6d3f49241f4b5aa3/originalImage/image.jpg --------------------------------------------------------------------------------