版权声明:博客内容仅参考,如有错误,请不吝指出,在此谢过。 https://blog.csdn.net/zhaiax672/article/details/88841861
引言
此篇博客将介绍 如何对 低对比度、模糊、噪声多 等图像进行处理。
示例图片
lowContrast.jpg:对比度很低,而且可以注意到图像下部分的亮度和数字的亮度几乎相同
obscure.jpg:图像很模糊,而且存在很多噪声
代码
import cv2
import numpy as np
# 用sobel算子画出图像的轮廓
def sobel(img):
sobelx = cv2.Sobel(img,cv2.CV_64F,1,0) # x方向梯度
sobely = cv2.Sobel(img,cv2.CV_64F,0,1) # y方向梯度
sobelx = cv2.convertScaleAbs(sobelx) # x的绝对值
sobely = cv2.convertScaleAbs(sobely) # y的绝对值
sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0) # x与y相加
return sobelxy
# 递归OSTU算法
def recursionOTSU(img, n):
img = sobel(img) # 用sobel算子画出图像的轮廓
array = np.ravel(img) # 将 二维数组img 降维为 一维数组array
for i in range(n):
retval,array = cv2.threshold(array,0,0,cv2.THRESH_TOZERO + cv2.THRESH_OTSU) # 对 array 同时进行 阈值化为0 和 OTSU算法
array = array[array > 0] # 将 array 中等于0的元素去除掉
retval,img = cv2.threshold(img,retval,0,cv2.THRESH_TOZERO) # 用新的阈值对图像进行 阈值化为0 的操作
retval,img = cv2.threshold(img,retval,255,cv2.THRESH_BINARY) # 对递归后的图像进行二进制阈值化操作,让图像更清晰
img = cv2.medianBlur(img,3) # 用中值滤波去除噪点
return img
a = cv2.imread(r"C:\Users\axin\Desktop\lowContrast.jpg",cv2.IMREAD_GRAYSCALE)
b = recursionOTSU(a,1) # 发现只递归一次就可以得到清晰的图像
cv2.imshow("original",a)
cv2.imshow("result",b )
cv2.waitKey()
cv2.destroyAllWindows()
效果图:
lowContrast.jpg
obscure.jpg
大家可以将代码中某些步骤注释掉,可以很直观感受到差异。