文字边缘提取
原图:
import cv2
import matplotlib.pyplot as plt # 添加 matplotlib 库以显示图像
# 读取原始图像
img = cv2.imread("wenzi.jpg")
# 将图像转换成灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 使用中值滤波去除噪声
median = cv2.medianBlur(gray, 3)
# 对图像进行直方图均衡化以增强对比度
equalize = cv2.equalizeHist(median)
# 使用 Sobel 算子进行锐化处理,计算 x 方向的梯度
sobel = cv2.Sobel(median, cv2.CV_8U, 1, 0, ksize=3)
# 显示 Sobel 算子处理后的图像
plt.imshow(sobel, cmap='gray') # 使用灰度色图显示图像
plt.axis('off') # 关闭坐标轴显示
plt.show() # 显示图像
还有另一种输出图像的方式:(其余代码不变)
# 显示 Sobel 算子处理后的图像
cv2.imshow('Sobel Image', sobel) # 创建一个名为 'Sobel Image' 的窗口,并显示 Sobel 处理后的图像
cv2.waitKey(0) # 等待用户按下任意键
cv2.destroyAllWindows() # 关闭所有 OpenCV 创建的窗口
阈值分割处理
# 读取原始图像
img = cv2.imread("wenzi.jpg")
# 将图像转换成灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 使用中值滤波去除噪声
median = cv2.medianBlur(gray, 3)
# 对图像进行直方图均衡化以增强对比度
equalize = cv2.equalizeHist(median)
# 使用 Sobel 算子进行锐化处理,计算 x 方向的梯度
sobel = cv2.Sobel(median, cv2.CV_8U, 1, 0, ksize=3)
# 对图像进行二值化处理,使用 Otsu 阈值分割法
ret, binary = cv2.threshold(sobel, 0, 255, cv2.THRESH_OTSU + cv2.THRESH_BINARY)
# 显示 Sobel 算子处理后的图像
plt.imshow(binary, cmap='gray') # 使用灰度色图显示图像
plt.axis('off') # 关闭坐标轴显示
plt.show() # 显示图像
图像的腐蚀、膨胀和文字区域提取
图像腐蚀和膨胀将图像的背景轮廓提取出来,接着利用文字提取算法识别目标文字。算法流程如下:
用腐蚀膨胀处理后的图像减去二值化处理图像,提取图像中的文字轮廓。
通过开运算处理去除图像的噪声并保留文字内容,
通过闭运算处理过滤掉图像文字中的黑点噪声,提取更清晰的文字轮廓
# 读取原始图像
img = cv2.imread("wenzi.jpg")
# 膨胀和腐蚀处理
# 设置膨胀和腐蚀操作的核函数
element1 = cv2.getStructuringElement(cv2.MORPH_RECT, (30, 9)) # 用于腐蚀的核函数
element2 = cv2.getStructuringElement(cv2.MORPH_RECT, (24, 6)) # 用于膨胀的核函数
# 膨胀突出轮廓
dilation = cv2.dilate(binary, element2, iterations=1)
# 腐蚀去掉细节
erosion = cv2.erode(dilation, element1, iterations=1)
# 查找图像中的轮廓
region = []
contours, hierarchy = cv2.findContours(erosion, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# 筛选轮廓
for i in range(len(contours)):
# 遍历所有轮廓
cnt = contours[i]
# 计算轮廓面积
area = cv2.contourArea(cnt)
# 寻找最小外接矩形
rect = cv2.minAreaRect(cnt)
# 获取轮廓的四个点坐标
box = cv2.boxPoints(rect)
box = np.int0(box)
# 计算矩形的高度和宽度
height = abs(box[0][1] - box[2][1])
width = abs(box[0][0] - box[2][0])
# 过滤掉高度远大于宽度的矩形
if height > width * 1.5:
continue
# 将符合条件的矩形保存到区域列表中
region.append(box)
# 用绿线绘制识别出的文字轮廓
for box in region:
print(box) # 打印轮廓的四个点坐标
cv2.drawContours(img, [box], 0, (0, 255, 0), 2) # 绘制轮廓
cv2.imshow('Dilation Image', dilation) # 显示膨胀处理后的图像
cv2.imshow('Erosion Image', erosion) # 显示腐蚀处理后的图像
cv2.imshow('Result Image', img) # 显示结果图像(带轮廓)
cv2.waitKey(0) # 等待用户按下任意键
cv2.destroyAllWindows() # 关闭所有 OpenCV 创建的窗口