Python图像处理2

文字边缘提取

原理

原图:


原图
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 创建的窗口
膨胀

腐蚀

文字区域提取
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容