├── .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 | 
10 |
11 | 截取280*280大小大图片。效果如下:
12 | 
13 |
14 | 纯背景图片
15 | 
16 |
17 | 去除背景。效果如下:
18 | 
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
--------------------------------------------------------------------------------