图像处理——抠图

import cv2
import numpy as np

# 边缘检测
def getCanny(image):
	# 高斯模糊
	blur = cv2.GaussianBlur(image, (3, 3), 2, 2)
	cv2.imwrite('2_blur.jpg', blur)
	# 边缘检测
	canny = cv2.Canny(blur, 60, 240, apertureSize=3)
	cv2.imwrite('3_canny.jpg', canny)
	# 膨胀操作,尽量使边缘闭合
	kernel = np.ones((3, 3), np.uint8)
	dilate = cv2.dilate(canny, kernel, iterations=1)
	cv2.imwrite('4_dilate.jpg', dilate)
	return dilate

# 最大轮廓检测
def findMaxContour(image):
	# 寻找轮廓
	_, contours, _ = cv2.findContours(image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
	# 计算面积
	max_contour = []
	max_area = 0.0
	for contour in contours:
		currentArea = cv2.contourArea(contour)
		if currentArea > max_area:
			max_area = currentArea
			max_contour = contour
	max_contour_img = img.copy()
	cv2.drawContours(max_contour_img, max_contour, -1, (0, 0, 255), 3)
	cv2.imwrite('5_max_contour.jpg', max_contour_img)
	return max_contour

# 四边形顶点检测
def getBoxPoint(contour):
	# 多边形拟合凸包
	hull = cv2.convexHull(contour)
	epsilon = 0.02 * cv2.arcLength(contour, True)
	boxes= cv2.approxPolyDP(hull, epsilon, True)
	boxes = boxes.reshape((len(boxes), 2))
	boxes_img = img.copy()
	for box in boxes:
		cv2.circle(boxes_img, tuple(box), 5, (0, 0, 255), 2)
	cv2.imwrite('6_boxes.jpg', boxes_img)
	return boxes

# 四边形顶点排序,[top-left, top-right, bottom-right, bottom-left]
def orderPoints(boxes):
	rect = np.zeros((4, 2), dtype="float32")
	s = boxes.sum(axis=1)
	rect[0] = boxes[np.argmin(s)]
	rect[2] = boxes[np.argmax(s)]
	diff = np.diff(boxes, axis=1)
	rect[1] = boxes[np.argmin(diff)]
	rect[3] = boxes[np.argmax(diff)]
	return rect

# 计算长宽
def pointDistance(a, b):
	return int(np.sqrt(np.sum(np.square(a - b))))

# 透视变换
def warpImage(boxes):
	w, h = pointDistance(boxes[0], boxes[1]), \
		   pointDistance(boxes[1], boxes[2])
	dst_rect = np.array([[0, 0],
						 [w - 1, 0],
						 [w - 1, h - 1],
						 [0, h - 1]], dtype='float32')
	M = cv2.getPerspectiveTransform(boxes, dst_rect)
	warped_img = img.copy()
	warped = cv2.warpPerspective(warped_img, M, (w, h))
	cv2.imwrite('7_warped.jpg', warped)
	return warped

if __name__ == '__main__':
	path = '1_source.jpg'
	img = cv2.imread(path)
	dilate = getCanny(img)
	max_contour = findMaxContour(dilate)
	boxes = getBoxPoint(max_contour)
	boxes = orderPoints(boxes)
	warped = warpImage(boxes)

1_source.jpg
在这里插入图片描述
2_blur.jpg
在这里插入图片描述
3_canny.jpg
在这里插入图片描述
4_dilate.jpg
在这里插入图片描述
5_max_contour.jpg
在这里插入图片描述
6_boxes.jpg
在这里插入图片描述
7_warped.jpg
在这里插入图片描述

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值