如何通过阈值处理提升skimage旋转后的图像质量?
问题
初始图像为黑白线条图,执行旋转操作后图像出现模糊,尝试通过阈值处理去除模糊时得到锯齿状图像,调整阈值参数后图像要么全黑要么全白,如何优化图像质量或调整阈值得到清晰图像?
操作流程
- 初始图像:初始黑白线条图
- 旋转代码:
from skimage.transform import rotate image = cv2.imread('122.png') rotated = rotate(image,34,cval=1,resize = True)
- 旋转后图像:旋转后模糊图像
- 阈值处理代码:
ret, thresh_hold = cv2.threshold(rotated, 0, 100, cv2.THRESH_BINARY) plt.imshow(thresh_hold)
- 处理后图像:锯齿状图像
解决方案
1. 修复旋转环节的核心问题
skimage.transform.rotate默认会将图像转换为0-1范围的浮点型,而你用OpenCV的threshold时使用了0-100的阈值区间,两者范围不匹配,这是阈值调整失效的根本原因。同时旋转时的插值方法选择不当会加剧模糊,优化后的旋转代码:
from skimage.transform import rotate import cv2 import numpy as np # 以灰度模式读取图像,避免多通道干扰 image = cv2.imread('122.png', cv2.IMREAD_GRAYSCALE) # 使用最邻近插值(order=0),适合二值图旋转,减少模糊;cval设为255对应白色背景 rotated = rotate(image, 34, cval=255, resize=True, order=0) # 将浮点型图像转回0-255范围的8位无符号整数 rotated = np.uint8(rotated * 255)
2. 适配的阈值处理
现在图像是标准0-255范围的灰度图,使用匹配的阈值参数进行二值化:
# 背景为白色(255),目标线条为黑色,用THRESH_BINARY_INV反转阈值,保留黑色线条 ret, thresh_hold = cv2.threshold(rotated, 200, 255, cv2.THRESH_BINARY_INV) # 若存在局部亮度不均,改用自适应阈值效果更好 thresh_hold = cv2.adaptiveThreshold(rotated, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 2)
3. 可选:形态学修复细节
如果处理后仍有小噪点或轻微锯齿,用形态学操作优化:
# 创建2x2的结构元素 kernel = np.ones((2,2), np.uint8) # 闭操作填补线条缝隙,开操作去除白色背景上的噪点 thresh_hold = cv2.morphologyEx(thresh_hold, cv2.MORPH_CLOSE, kernel) thresh_hold = cv2.morphologyEx(thresh_hold, cv2.MORPH_OPEN, kernel)
内容的提问来源于stack exchange,提问作者user20658672
相关产品推荐
相关产品推荐

