首页
登录 | 注册

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

文章目录

    • 引言
    • 示例图片
    • 代码

引言

此篇博客将介绍 如何对 低对比度、模糊、噪声多 等图像进行处理。

示例图片

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
低对比度、模糊、噪声多等图像处理

大家可以将代码中某些步骤注释掉,可以很直观感受到差异。



2020 jeepxie.net webmaster#jeepxie.net
10 q. 0.009 s.
京ICP备10005923号