📅  最后修改于: 2023-12-03 15:09:09.809000             🧑  作者: Mango
在图像处理中,矩形往往是一个常用的图形。在一些应用场景中,需要对多个不规则的矩形进行处理,比如在OCR(光学字符识别)中需要对文本区域进行定位、分割和识别,这时候就需要对这些矩形的位置进行操作,将它们变换到统一的位置。
下面介绍如何使用Python中的OpenCV库对矩形进行变换,将它们统一变换到一个指定的位置。
首先,我们需要导入图像处理所需的依赖库。本文主要使用OpenCV和NumPy两个库。
import cv2
import numpy as np
读入图像并将其转化为二值图。这里我们假设输入的图像中只有一个矩形。如果有多个矩形,可以先使用其他方法(比如边缘检测)进行矩形检测,然后对每个矩形进行操作。
# 读入图像并转为二值图
img = cv2.imread("input.png")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
_, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
接下来,对二值图进行轮廓查找,找到该图中的所有轮廓,并筛选出矩形。在筛选矩形时,我们可以根据面积和宽高比进行限制,获取符合条件的矩形。
# 查找轮廓
contours, hierarchy = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 筛选矩形
rectangles = []
for contour in contours:
area = cv2.contourArea(contour)
if area < 100:
continue
x, y, w, h = cv2.boundingRect(contour)
if h / w > 1.5 or h / w < 0.5:
continue
rectangles.append((x, y, w, h))
根据目标位置和矩形的位置计算出变换矩阵,然后应用变换。这里我们假设目标位置是图像左上角。对于其他位置,只需将目标位置修改为对应的坐标即可。
# 计算变换矩阵并应用变换
for (x, y, w, h) in rectangles:
src_points = np.array([(0, 0), (w, 0), (0, h)], dtype=np.float32)
dst_points = np.array([(0, 0), (w, 0), (0, h)], dtype=np.float32) + np.array([100, 100])
M = cv2.getAffineTransform(src_points, dst_points)
img = cv2.warpAffine(img, M, (img.shape[1], img.shape[0]))
最后,将结果输出到文件中。
# 输出结果
cv2.imwrite("output.png", img)
import cv2
import numpy as np
# 读入图像并转为二值图
img = cv2.imread("input.png")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
_, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
# 查找轮廓
contours, hierarchy = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 筛选矩形
rectangles = []
for contour in contours:
area = cv2.contourArea(contour)
if area < 100:
continue
x, y, w, h = cv2.boundingRect(contour)
if h / w > 1.5 or h / w < 0.5:
continue
rectangles.append((x, y, w, h))
# 计算变换矩阵并应用变换
for (x, y, w, h) in rectangles:
src_points = np.array([(0, 0), (w, 0), (0, h)], dtype=np.float32)
dst_points = np.array([(0, 0), (w, 0), (0, h)], dtype=np.float32) + np.array([100, 100])
M = cv2.getAffineTransform(src_points, dst_points)
img = cv2.warpAffine(img, M, (img.shape[1], img.shape[0]))
# 输出结果
cv2.imwrite("output.png", img)
如上图所示,经过矩形统一变换,所有矩形的顶点均匀地分布在目标位置周围,达到了几乎相同的效果。