低对比度、模糊、噪声多等图像处理

版权声明:博客内容仅参考,如有错误,请不吝指出,在此谢过。 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
在这里插入图片描述
大家可以将代码中某些步骤注释掉,可以很直观感受到差异。

猜你喜欢

转载自blog.csdn.net/zhaiax672/article/details/88841861
今日推荐