使用opencv优化图片(画面变清晰)

news2024/12/24 9:01:21

文章目录

  • 需求
    • 影响照片清晰度的因素
  • 实现
    • 降噪
      • 测试代码
    • 锐化
      • 空间锐化
      • Unsharp Masking
      • 频率域锐化
      • 对比测试
    • 对比度增强
      • 常用算法
      • 对比测试

需求

对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等

影响照片清晰度的因素

影响照片清晰度的因素有很多,主要可以从以下几个方面来分析
1. 拍摄设备

  • 相机传感器:相机传感器的大小和像素密度直接影响到图像的分辨率和细节捕捉能力。较大的传感器通常能够捕获更多的光线信息,从而产生更清晰的图像。
  • 镜头质量:镜头是决定照片清晰度的关键因素之一。镜头的光学设计、制造质量和光圈大小都会影响图像的清晰度。优质的镜头可以减少色差和像差,提高图像质量。
  • 相机稳定性:拍摄时的相机抖动会导致模糊。使用三脚架或其他稳定设备可以提高清晰度

2. 拍摄条件

  • 光线:充足的光线有助于提高图像质量。自然光或人工光源的选择与布置非常重要,过暗或过亮的光线都会影响清晰度。
  • 对焦:正确的对焦是照片清晰的基础。手动或自动对焦的选择以及对焦点的位置都需要准确。
  • 曝光:正确的曝光设置可以保证图像不过曝或欠曝,从而保持细节。

3. 拍摄参数

  • ISO感光度:高ISO值会导致更多的数字噪声,影响清晰度。在光线充足的情况下尽可能使用低ISO值。
  • 快门速度:较快的快门速度有助于冻结动作,减少运动模糊。
  • 光圈:光圈大小不仅影响景深还影响进光量,大光圈(小f值)可以带来更浅的景深,而小光圈则可以获得更大的景深范围。

4. 后期处理

  • 降噪:使用后期软件去除图像中的噪声可以提高清晰度。
  • 锐化:适度的锐化可以增强图像的边缘,使其看起来更清晰。
  • 对比度和色彩调整:适当的对比度和色彩调整可以让图像的细节更加突出。

5. 存储和传输

  • 文件格式:不同的文件格式(如JPEG、PNG、TIFF)有不同的压缩率和信息保留程度,选择合适的格式可以保证图像质量。
  • 分辨率:高分辨率的图像包含更多的细节信息,但文件体积也更大。
  • 压缩算法:压缩算法的选择和压缩等级也会影响最终的清晰度。

6. 观看介质
显示器质量:显示设备的分辨率、色彩还原能力等也会影响观看体验。显示器的亮度、对比度和分辨率同样影响图像清晰度。

其他知识
一寸照是一种标准的证件照片尺寸,在不同的国家和地区有不同的具体尺寸要求。在中国,一寸照片的常见规格如下

  • 尺寸:25mm × 35mm(宽×高)
  • 分辨率:如果用于打印,通常推荐的分辨率为300dpi(每英寸点数)

数码照片的像素尺寸

  • 小一寸:一般为220px(像素)× 330px(像素)
  • 大一寸:有时也会使用33mm × 48mm,对应的像素尺寸约为480px × 660px(300dpi)

实现

使用 OpenCV 让图像变得更加清晰,可以通过多种图像处理技术来实现。这些技术主要包括降噪、锐化、对比度增强等。

降噪

  • 噪声是图像处理中不可避免的问题,它会影响图像的质量和识别效果
  • 在进行任何锐化操作之前,通常需要先进行降噪处理,因为噪声会放大任何后续的处理操作带来的负面影响
  • 常见的噪声类型包括高斯噪声、椒盐噪声、泊松噪声等。这些噪声会对图像造成模糊、失真、对比度降低等不良影响
  • 降噪算法通常基于图像的空间域或频域特性,通过平滑处理或边缘保留技术来减少噪声

中值滤波(Median Filter)

原理:中值滤波是一种非线性滤波器,它通过对图像中的像素值进行排序并取中间值来进行滤波处理。对于图像中的每个像素,选取其周围一定区域内的所有像素值,并对其进行排序,然后将排序后的像素值的中位数赋予该像素。

特点:中值滤波能够有效去除椒盐噪声和脉冲噪声,对图像中的孤立噪声点具有较强的抑制能力。同时,它能够较好地保留图像的边缘和细节信息,不会造成图像模糊。然而,中值滤波对于高斯噪声的去除效果不佳,且计算量相对较大

高斯滤波(Gaussian Filter)

原理:高斯滤波是一种线性平滑滤波器,它利用高斯函数对图像进行加权平均,从而有效地去除噪声并平滑图像。高斯滤波通过卷积操作实现,卷积核的大小和标准差决定了滤波的强度和效果

特点:高斯滤波具有良好的平滑效果,能够有效地抑制图像中的噪声。同时,高斯滤波具有旋转不变性和尺度不变性,适用于各种方向和尺度的噪声。然而,高斯滤波会造成图像细节丢失,降低图像锐度,对椒盐噪声等非平滑噪声的去除效果不佳。
双边滤波(Bilateral Filter)

原理:双边滤波是一种边缘保留滤波方法,它不仅考虑像素的空间距离,还考虑像素值的相似性。在滤波过程中,距离中心点越近且像素值越相似的像素,其权重越大。这样,双边滤波可以有效地保留图像边缘,同时抑制噪声。

特点:双边滤波结合了图像的空间邻近度和像素值相似度,通过对像素的空间距离和颜色相似度进行加权平均来实现滤波。它常用于图像去噪、边缘增强、细节保留等。双边滤波能够较好地保留图像的边缘信息,但计算量相对较大。

测试代码

import cv2  
import numpy as np
# 黑白
def denoise_image(image_path, output_path):
    img = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
    dst = cv2.fastNlMeansDenoising(img, None, 10, 7, 21)
    #cv2.imwrite(output_path, dst)
    cv2.imshow('Original', img)
    cv2.imshow('dst', dst)
    cv2.waitKey(0)  
    cv2.destroyAllWindows()
#彩色
def denoise_color_image(image_path, output_path):
    img = cv2.imread(image_path)
    dst = cv2.fastNlMeansDenoisingColored(img, None, 10, 10, 7, 21)
    #cv2.imwrite(output_path, dst)
    cv2.imshow('Original', img)
    cv2.imshow('dst', dst)
    cv2.waitKey(0)  
    cv2.destroyAllWindows()

#denoise_image("test01.jpg", "test02.jpg")
denoise_color_image("test01.jpg", "test02.jpg")

双边滤波

def bilateral_filtering(image_path, output_path):
     img = cv2.imread(image_path)
     dst = cv2.bilateralFilter(img, 9, 75, 75)
     cv2.imwrite(output_path, dst)

中值滤波可以有效去除椒盐噪声,但对于高斯噪声效果有限

def median_filtering(image_path, output_path):
    img = cv2.imread(image_path)
    dst = cv2.medianBlur(img, 5)
    cv2.imwrite(output_path, dst)

锐化

  • 锐化可以增强图像的边缘和细节,使图像看起来更清晰。
  • 锐化可以分为两种基本类型:空间域锐化和频率域锐化

空间锐化

空间域锐化主要通过卷积操作实现
比如
Laplacian 锐化是一种基于二阶导数的锐化方法,它利用 Laplacian 算子来增强图像的边缘

import cv2
import numpy as np
import matplotlib.pyplot as plt

def laplacian_sharpen(image_path):
    img = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
    laplacian = cv2.Laplacian(img, cv2.CV_64F)
    sharpened = cv2.convertScaleAbs(img - laplacian)
    return sharpened

sharp_laplacian = laplacian_sharpen(image_path)

Unsharp Masking

是一种经典的锐化方法,通过减去轻微模糊后的图像来增强边缘

def unsharp_mask(image, kernel_size=(5, 5), sigma=1.0, amount=1.0, threshold=0):
    blurred = cv2.GaussianBlur(image, kernel_size, sigma)
    unsharp_image = cv2.addWeighted(image, 1 + amount, blurred, -amount, 0)
    return unsharp_image

sharp_unsharp_mask = unsharp_mask(img, amount=1.5)

频率域锐化

频率域锐化则是通过对图像进行傅里叶变换后,在频域中进行处理,再逆变换回到空域
通过增强高频成分来锐化图像

def high_frequency_boost(image, kernel_size=(5, 5), sigma=1.0, amount=1.0):
    blurred = cv2.GaussianBlur(image, kernel_size, sigma)
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    high_pass = gray - blurred
    sharpened = cv2.addWeighted(gray, 1 + amount, high_pass, amount, 0)
    return sharpened

sharp_high_frequency = high_frequency_boost(img, amount=1.5)

对比测试

# 读取原始图像
image_path = 'path/to/your/input_image.jpg'
img = cv2.imread(image_path)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)  # 转换为 RGB 格式以正确显示颜色

# Laplacian 锐化
sharp_laplacian = laplacian_sharpen(image_path)

# Unsharp Masking
sharp_unsharp_mask = unsharp_mask(img, amount=1.5)

# High-Frequency Boosting
sharp_high_frequency = high_frequency_boost(img, amount=1.5)

# 展示图像
plt.figure(figsize=(12, 12))

plt.subplot(2, 2, 1)
plt.imshow(img)
plt.title('Original Image')
plt.axis('off')

plt.subplot(2, 2, 2)
plt.imshow(sharp_laplacian, cmap='gray')
plt.title('Laplacian Sharpened')
plt.axis('off')

plt.subplot(2, 2, 3)
plt.imshow(sharp_unsharp_mask)
plt.title('Unsharp Masking')
plt.axis('off')

plt.subplot(2, 2, 4)
plt.imshow(sharp_high_frequency, cmap='gray')
plt.title('High-Frequency Boosting')
plt.axis('off')

plt.tight_layout()
plt.show()

注意颜色通道问题

报错
 high_pass = gray - blurred  报错 ValueError: operands could not be broadcast together with shapes (413,295) (413,295,3)

在这里插入图片描述

对比度增强

OpenCV 提供了多种方法来增强图像的对比度

常用算法

  • 直方图均衡化
    直方图均衡化是一种线性方法,通过改变图像的亮度分布来提高对比度
  • 自适应直方图均衡化
    是一种局部直方图均衡化方法,适用于图像中不同区域对比度不同的情况。
  • Gamma 校正
    Gamma 校正是一种非线性方法,用于调整图像的对比度和亮度
  • 对比度拉伸
    通过拉伸图像的灰度级范围来增强对比度

对比测试

import cv2
import numpy as np
import matplotlib.pyplot as plt

# 定义直方图均衡化函数
def histogram_equalization(image):
    # 应用直方图均衡化
    eq = cv2.equalizeHist(image)
    return eq

# 定义自适应直方图均衡化函数
def adaptive_histogram_equalization(image):
    # 创建 CLAHE 对象
    clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
    # 应用自适应直方图均衡化
    cl = clahe.apply(image)
    return cl

# 定义 Gamma 校正函数
def gamma_correction(image, gamma=1.0):
    inv_gamma = 1.0 / gamma
    table = np.array([((i / 255.0) ** inv_gamma) * 255 for i in range(256)]).astype("uint8")
    # 应用 Gamma 校正查找表
    adjusted = cv2.LUT(image, table)
    return adjusted

# 定义对比度拉伸函数
def contrast_stretching(image, low_percentile=2, high_percentile=98):
    # 计算灰度级的百分位数
    low_val = np.percentile(image, low_percentile)
    high_val = np.percentile(image, high_percentile)
    
    # 应用对比度拉伸
    stretched = np.clip((image - low_val) * 255 / (high_val - low_val), 0, 255).astype(np.uint8)
    return stretched

# 读取原始图像
image_path = 'test02.jpg'
img_gray = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)

# 对灰度图像进行处理
enhanced_eq = histogram_equalization(img_gray)
enhanced_clahe = adaptive_histogram_equalization(img_gray)
enhanced_gamma = gamma_correction(img_gray, gamma=0.8)
enhanced_stretched = contrast_stretching(img_gray)

# 将处理后的灰度图像转换为彩色图像
enhanced_eq_color = cv2.cvtColor(enhanced_eq, cv2.COLOR_GRAY2RGB)
enhanced_clahe_color = cv2.cvtColor(enhanced_clahe, cv2.COLOR_GRAY2RGB)
enhanced_gamma_color = cv2.cvtColor(enhanced_gamma, cv2.COLOR_GRAY2RGB)
enhanced_stretched_color = cv2.cvtColor(enhanced_stretched, cv2.COLOR_GRAY2RGB)

# 展示图像
plt.figure(figsize=(12, 12))

plt.subplot(3, 2, 1)
plt.imshow(cv2.cvtColor(img_gray, cv2.COLOR_GRAY2RGB))
plt.title('Original Grayscale Image')
plt.axis('off')

plt.subplot(3, 2, 2)
plt.imshow(enhanced_eq_color)
plt.title('Histogram Equalization')
plt.axis('off')

plt.subplot(3, 2, 3)
plt.imshow(enhanced_clahe_color)
plt.title('Adaptive Histogram Equalization')
plt.axis('off')

plt.subplot(3, 2, 4)
plt.imshow(enhanced_gamma_color)
plt.title('Gamma Correction')
plt.axis('off')

plt.subplot(3, 2, 5)
plt.imshow(enhanced_stretched_color)
plt.title('Contrast Stretching')
plt.axis('off')

plt.tight_layout()
plt.show()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2130085.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

百度地图SDK Android版开发 11 覆盖物示例 4 线

百度地图SDK Android版开发 11 覆盖物示例 4 线 前言界面布局MapPolyline类常量成员变量初始值创建覆盖物移除覆盖物设置属性加载地图和释放地图 MapPolylineActivity类控件响应事件 运行效果图 前言 文本通过创建多个不同线宽的折线和大地曲线,介绍Polyline的使用…

numpy中的比较运算

目录 比较运算符 比较运算符 有两种情况会普遍使用比较运算符,一个是从数组中查询满足条件的元素,另一个是根据判断的结果执行不同的操作。 示例入下: import numpy as np arr7 np.array([[1,2,10],[10,8,3],[7,6,5]]) arr8 np.array([[2,…

整流器制造5G智能工厂物联数字孪生平台,推进制造业数字化转型

整流器制造行业作为制造业的重要组成部分,也在积极探索数字化转型的新路径。整流器,作为电力电子领域的关键元件,广泛应用于通信、工业控制、新能源等多个领域,其制造过程的智能化升级不仅关乎产品性能的提升,更是推动…

opencv使用videocapture打开视频时,依赖opencv_ffmpeg***.dll,默认必须放到执行目录,自定义目录需要重新编译opencv库

1. 找到modules下opencv_highgui模块的cap_ffmpeg.cpp 2. 找到加载opencv_ffmpeg的接口, 修改接口内opencv_ffmpeg的路径即可.

YOLOv10优改系列一:YOLOv10融合C2f_Ghost网络,让YoloV10实现性能的均衡

💥 💥💥 💥💥 💥💥 💥💥神经网络专栏改进完整目录:点击 💗 只需订阅一个专栏即可享用所有网络改进内容,每周定时更新 文章内容&#x…

基于JavaWeb开发的javaSpringboot+mybatis+layui的装修验收管理系统设计和实现

基于JavaWeb开发的javaSpringbootmybatislayui的装修验收管理系统设计和实现 🍅 作者主页 网顺技术团队 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 文末获取源码联系方式 📝 🍅 查看下方微信号获取联系…

【第31章】Spring Cloud之Sentinel控制台推送规则到Nacos

文章目录 前言一、下载源码1. 下载源码 二、规则配置1. Nacos适配1.1 使用数据源1.2 复制官方案例1.3 动态规则配置中心 2. 前端路由配置3. 提示4. 编译和启动 三、测试1. 修改前2. 修改后 总结 前言 前面我们已经完成了通过nacos存储提供者流控配置文件,下面我们来…

腾讯云升级多个云存储解决方案 以智能化存储助力企业增长

9月6日,在腾讯数字生态大会腾讯云储存专场上,腾讯云升级多个存储解决方案:Data Platform 数据平台解决方案重磅发布,数据加速器 GooseFS、数据处理平台数据万象、日志服务 CLS、高性能并行文件存储 CFS Turbo 等多产品全新升级&am…

Nuxt Kit 的使用指南:模块创建与管理

title: Nuxt Kit 的使用指南:模块创建与管理 date: 2024/9/11 updated: 2024/9/11 author: cmdragon excerpt: 摘要:本文是关于Nuxt Kit的使用指南,重点介绍了如何使用defineNuxtModule创建自定义模块及installModule函数以编程方式安装模块,以增强Nuxt 3应用的功能性、…

JD18年秋招笔试疯狂数列python解答

问题如下: 链接:疯狂序列_京东笔试题_牛客网 [编程题]疯狂序列 热度指数:149 时间限制:C/C 1秒,其他语言2秒 空间限制:C/C 32M,其他语言64M 东东从京京那里了解到有一个无限长的数字序列: 1…

空间物联网中的大规模接入:挑战、机遇和未来方向

这篇论文的标题是《Massive Access in Space-based Internet of Things: Challenges, Opportunities, and Future Directions》,作者包括Jian Jiao, Shaohua Wu, Rongxing Lu, 和 Qinyu Zhang。文章发表在2021年10月的IEEE Wireless Communications上。论文主要探讨…

计算机毕业设计 半成品配菜平台的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

数据结构算法——排序算法

1.排序 1.选择排序 不稳定&#xff0c;一般不用&#xff0c;基本排序 思路&#xff1a;过滤数组&#xff0c;找到最小数&#xff0c;放在前面。 不稳&#xff1a;导致原本在前的数据移动到后面。 int arr[];for(i0;i<arr.length-1;i){int smallesti; for(ji1;j<leng…

计算机毕业设计 网上体育商城系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

加密

一、加密 加密运算需要两个输入&#xff1a;密钥和明文 解密运算也需要两个输入&#xff1a;密钥和密文 密文通常看起来都是晦涩难懂、毫无逻辑的&#xff0c;所以我们一般会通过传输或者存储密文来保护私密数据&#xff0c;当然&#xff0c;这建立在一个基础上&#xff0c;…

局域网windows下使用Git

windows下如何使用局域网进行git部署 准备工作第一步 &#xff0c;ip设置设置远程电脑的ip设置&#xff0c;如果不会设置请点击[这里](https://blog.csdn.net/Black_Friend/article/details/142170705?spm1001.2014.3001.5501)设置本地电脑的ip&#xff1a;验证 第二步&#x…

腾讯云使用

注&#xff1a;本文的所有演示的代码都基于尚硅谷的尚乐代驾项目 对象存储COS 一种云存储器 官方文档&#xff1a; 对象存储 快速入门-SDK 文档-文档中心-腾讯云 (tencent.com) 一 上传文件 1 初始化客户端 官方示例&#xff1a; // 1 传入获取到的临时密钥 (tmpSecret…

一文教你弄懂网络协议栈以及报文格式

文章目录 OSI七层网络协议栈示意图1. 应用层&#xff08;Application Layer&#xff09;2. 表示层&#xff08;Presentation Layer&#xff09;3. 会话层&#xff08;Session Layer&#xff09;4. 传输层&#xff08;Transport Layer&#xff09;5. 网络层&#xff08;Network …

Qt QSerialPort数据发送和接收DataComm

文章目录 Qt QSerialPort数据发送和接收DataComm2.添加 Qt Serial Port 模块3.实例源码 Qt QSerialPort数据发送和接收DataComm Qt 框架的Qt Serial Port 模块提供了访问串口的基本功能&#xff0c;包括串口通信参数配置和数据读写&#xff0c;使用 Qt Serial Port 模块就可以…

【超详细】Plaxis软件简介、 Plaxis Python API环境搭建、自动化建模、Python全自动实现、典型岩土工程案例实践应用

查看原文>>>【案例教程】PLAXIS软件丨自动化建模、典型岩土工程案例解析、模型应用、数据分析、图表制作 目录 第一部分&#xff1a;Plaxis软件简介及 Plaxis Python API环境搭建 第二部分&#xff1a;Plaxis自动化建模-基础案例 第三部分&#xff1a;进阶案例-Pyt…