【图像处理】:opencv实现模糊图像处理和对比度增强

模糊图像处理

在传统图像处理中,OpenCV 可以通过 去模糊(Deblurring)锐化(Sharpening) 技术让模糊图像变得更清晰。常用的方法包括:

  1. 反卷积(Wiener 滤波) - 适用于已知模糊核(如运动模糊)的情况。
  2. 非锐化掩码(Unsharp Masking) - 增强边缘对比度。
  3. 拉普拉斯锐化(Laplacian Sharpening) - 突出高频细节。
  4. 边缘增强滤波器(如 Sobel、Scharr) - 强化边缘信息。

方法 1:Wiener 反卷积(已知模糊核)

适用于已知模糊类型(如运动模糊、高斯模糊)的情况。

import cv2
import numpy as np

def wiener_deblur(image_path, kernel_size=(5, 5), snr=1000):
    # 读取图像(转为灰度图)
    img = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
    if img is None:
        raise FileNotFoundError(f"Image not found: {image_path}")

    # 模拟模糊核(这里用高斯模糊核,实际应用需根据真实模糊调整)
    blur_kernel = np.ones(kernel_size, np.float32) / (kernel_size[0] * kernel_size[1])
    blurred = cv2.filter2D(img, -1, blur_kernel)

    # Wiener 反卷积去模糊
    deblurred = cv2.deconvolve(blurred, blur_kernel, snr)[0]
    deblurred = np.clip(deblurred, 0, 255).astype(np.uint8)  # 限制像素范围

    # 显示结果
    cv2.imshow("Original", img)
    cv2.imshow("Blurred", blurred)
    cv2.imshow("Deblurred (Wiener)", deblurred)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

# 使用示例
wiener_deblur("C:/Users/longc/Desktop/60000_8/source.jpg", kernel_size=(15, 15), snr=1000)

方法 2:非锐化掩码(Unsharp Masking)

通过增强高频细节来锐化图像。

import cv2

def unsharp_mask(image_path, kernel_size=(5, 5), alpha=1.5):
    img = cv2.imread(image_path)
    if img is None:
        raise FileNotFoundError(f"Image not found: {image_path}")

    # 高斯模糊
    blurred = cv2.GaussianBlur(img, kernel_size, 0)

    # 非锐化掩码:原图 - 模糊图 + 原图
    sharpened = cv2.addWeighted(img, 1 + alpha, blurred, -alpha, 0)

    cv2.imshow("Original", img)
    cv2.imshow("Sharpened (Unsharp Mask)", sharpened)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

# 使用示例
unsharp_mask("C:/Users/longc/Desktop/60000_8/source.jpg", alpha=1.5)

方法 3:拉普拉斯锐化(Laplacian Sharpening)

通过拉普拉斯算子增强边缘。

import cv2

def laplacian_sharpen(image_path, ksize=3, scale=1):
    img = cv2.imread(image_path)
    if img is None:
        raise FileNotFoundError(f"Image not found: {image_path}")

    # 拉普拉斯算子
    laplacian = cv2.Laplacian(img, cv2.CV_64F, ksize=ksize)
    sharpened = img - scale * laplacian
    sharpened = np.clip(sharpened, 0, 255).astype(np.uint8)

    cv2.imshow("Original", img)
    cv2.imshow("Sharpened (Laplacian)", sharpened)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

# 使用示例
laplacian_sharpen("C:/Users/longc/Desktop/60000_8/source.jpg", scale=0.5)

方法 4:边缘增强(Sobel 滤波器)

通过 Sobel 算子增强边缘。

import cv2
import numpy as np

def sobel_edge_sharpen(image_path, ksize=3):
    img = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
    if img is None:
        raise FileNotFoundError(f"Image not found: {image_path}")

    # Sobel 边缘检测
    sobel_x = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=ksize)
    sobel_y = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=ksize)
    edges = cv2.magnitude(sobel_x, sobel_y)

    # 增强边缘
    sharpened = cv2.addWeighted(img, 1.0, edges.astype(np.uint8), 0.5, 0)

    cv2.imshow("Original", img)
    cv2.imshow("Sharpened (Sobel Edge)", sharpened)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

# 使用示例
sobel_edge_sharpen("C:/Users/longc/Desktop/60000_8/source.jpg")

总结

方法适用场景优点缺点
Wiener 反卷积已知模糊核(如运动模糊)去模糊效果好需估计模糊核
非锐化掩码轻微模糊计算快可能引入噪声
拉普拉斯锐化增强边缘简单高效可能放大噪声
Sobel 边缘增强强化边缘适用于低对比度图像可能过度锐化

推荐流程

  1. 先尝试 非锐化掩码unsharp_mask),调整 alpha 参数。
  2. 如果模糊较严重,尝试 Wiener 反卷积(需估计模糊核)。
  3. 如果图像边缘较弱,用 拉普拉斯锐化Sobel 边缘增强
    综合下来感觉*拉普拉斯锐化的效果最好

图像对比度增强的算法

在传统图像处理中,OpenCV 可以通过多种方法增强图像对比度,以下是几种常用算法及具体实现代码:


方法 1:直方图均衡化(Histogram Equalization)

原理:拉伸像素分布,增强全局对比度。
适用场景:整体偏暗或偏亮的图像。

import cv2

def histogram_equalization(image_path):
    img = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)  # 读取为灰度图
    if img is None:
        raise FileNotFoundError(f"Image not found: {image_path}")
    
    # 全局直方图均衡化
    equalized = cv2.equalizeHist(img)
    
    # 显示结果
    cv2.imshow("Original", img)
    cv2.imshow("Equalized (Global)", equalized)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

# 使用示例
histogram_equalization("C:/Users/longc/Desktop/60000_8/source.jpg")

改进版(CLAHE)
限制局部对比度过度增强,避免噪声放大。

def clahe_enhancement(image_path, clip_limit=2.0, grid_size=(8, 8)):
    img = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
    if img is None:
        raise FileNotFoundError(f"Image not found: {image_path}")
    
    # CLAHE(对比度受限的自适应直方图均衡化)
    clahe = cv2.createCLAHE(clipLimit=clip_limit, tileGridSize=grid_size)
    equalized = clahe.apply(img)
    
    cv2.imshow("Original", img)
    cv2.imshow("Equalized (CLAHE)", equalized)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

# 使用示例
clahe_enhancement("C:/Users/longc/Desktop/60000_8/source.jpg", clip_limit=2.0)

方法 2:伽马校正(Gamma Correction)

原理:调整像素的非线性映射,增强暗部或亮部细节。
适用场景:低对比度或光照不均的图像。

import cv2
import numpy as np

def gamma_correction(image_path, gamma=1.5):
    img = cv2.imread(image_path)
    if img is None:
        raise FileNotFoundError(f"Image not found: {image_path}")
    
    # 归一化并应用伽马校正
    normalized = img / 255.0
    corrected = np.power(normalized, gamma) * 255.0
    corrected = corrected.astype(np.uint8)
    
    cv2.imshow("Original", img)
    cv2.imshow(f"Gamma Corrected (γ={gamma})", corrected)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

# 使用示例(γ>1提亮暗部,γ<1抑制亮部)
gamma_correction("C:/Users/longc/Desktop/60000_8/source.jpg", gamma=1.5)

方法 3:对比度拉伸(Contrast Stretching)

原理:线性拉伸像素范围到[0, 255]。
适用场景:像素集中在狭窄区间的图像。

import cv2
import numpy as np

def contrast_stretching(image_path):
    img = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
    if img is None:
        raise FileNotFoundError(f"Image not found: {image_path}")
    
    # 计算当前像素范围
    min_val = np.min(img)
    max_val = np.max(img)
    
    # 线性拉伸
    stretched = ((img - min_val) / (max_val - min_val)) * 255
    stretched = stretched.astype(np.uint8)
    
    cv2.imshow("Original", img)
    cv2.imshow("Contrast Stretched", stretched)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

# 使用示例
contrast_stretching("C:/Users/longc/Desktop/60000_8/source.jpg")

方法 4:S形曲线调整(S-Curve Adjustment)

原理:通过S形曲线增强中间调对比度。
适用场景:需要同时增强暗部和亮部细节。

import cv2
import numpy as np

def s_curve_adjustment(image_path, alpha=1.5):
    img = cv2.imread(image_path)
    if img is None:
        raise FileNotFoundError(f"Image not found: {image_path}")
    
    # 归一化并应用S形曲线
    normalized = img / 255.0
    adjusted = 1 / (1 + np.exp(-alpha * (normalized - 0.5)))  # Sigmoid函数
    adjusted = (adjusted * 255).astype(np.uint8)
    
    cv2.imshow("Original", img)
    cv2.imshow(f"S-Curve Adjusted (α={alpha})", adjusted)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

# 使用示例
s_curve_adjustment("C:/Users/longc/Desktop/60000_8/source.jpg", alpha=5.0)

方法 5:局部对比度增强(Local Contrast Enhancement)

原理:通过局部均值和标准差调整对比度。
适用场景:需要增强纹理细节的图像。

import cv2
import numpy as np

def local_contrast_enhancement(image_path, block_size=8, c=10):
    img = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
    if img is None:
        raise FileNotFoundError(f"Image not found: {image_path}")
    
    # 计算局部均值和标准差
    mean = cv2.blur(img, (block_size, block_size))
    stddev = cv2.blur(img**2, (block_size, block_size))
    stddev = np.sqrt(stddev - mean**2)
    
    # 调整对比度
    enhanced = (img - mean) * (c / stddev) + mean
    enhanced = np.clip(enhanced, 0, 255).astype(np.uint8)
    
    cv2.imshow("Original", img)
    cv2.imshow("Local Contrast Enhanced", enhanced)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

# 使用示例
local_contrast_enhancement("C:/Users/longc/Desktop/60000_8/source.jpg", block_size=8, c=20)

方法对比总结

方法优点缺点适用场景
直方图均衡化全局对比度提升明显可能放大噪声整体偏暗/亮的图像
CLAHE避免局部过增强参数需调优光照不均的图像
伽马校正可针对性增强暗部或亮部需手动选择γ值低对比度图像
对比度拉伸简单直接对极端值敏感像素分布狭窄的图像
S形曲线同时增强暗部和亮部计算稍复杂需要平衡对比度的图像
局部对比度增强增强纹理细节可能引入块效应富含纹理的图像

完整代码示例(整合所有方法)

import cv2
import numpy as np

def enhance_contrast(image_path):
    img = cv2.imread(image_path)
    if img is None:
        raise FileNotFoundError(f"Image not found: {image_path}")
    
    # 方法1:直方图均衡化(灰度图)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    equalized = cv2.equalizeHist(gray)
    
    # 方法2:CLAHE
    clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
    clahe_img = clahe.apply(gray)
    
    # 方法3:伽马校正(彩色图)
    gamma = 1.5
    gamma_corrected = np.power(img / 255.0, gamma) * 255.0
    gamma_corrected = gamma_corrected.astype(np.uint8)
    
    # 显示所有结果
    cv2.imshow("Original", img)
    cv2.imshow("Histogram Equalized", equalized)
    cv2.imshow("CLAHE", clahe_img)
    cv2.imshow(f"Gamma (γ={gamma})", gamma_corrected)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

# 运行示例
enhance_contrast("C:/Users/longc/Desktop/60000_8/source.jpg")

如何选择最佳方法?

  1. 整体偏暗/亮 → 直方图均衡化或CLAHE
  2. 局部光照不均 → CLAHE
  3. 暗部细节丢失 → 伽马校正(γ>1)
  4. 需要锐化边缘 → 结合对比度增强和锐化算法(如Unsharp Mask)

运行前确保安装OpenCV:

pip install opencv-python numpy
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时间之里

好东西就应该拿出来大家共享

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值