当前位置: 首页 > news >正文

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

文章目录

  • 需求
    • 影响照片清晰度的因素
  • 实现
    • 降噪
      • 测试代码
    • 锐化
      • 空间锐化
      • 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 pltdef 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 sharpenedsharp_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_imagesharp_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 - blurredsharpened = cv2.addWeighted(gray, 1 + amount, high_pass, amount, 0)return sharpenedsharp_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 / gammatable = 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()

相关文章:

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

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强…...

Java 回顾方法的定义

一、方法的定义 1.修饰符(public static…)详见博客【Java 方法的定义】 2.返回值(int, double, char[],…., void)详见博客【Java 方法的定义】 3. break:跳出switch 结束循环,详…...

网络安全产品认证证书大全(持续更新...)

文章目录 一、引言二、《计算机信息系统安全专用产品销售许可证》2.1 背景2.2 法律法规依据2.3 检测机构2.4 检测依据2.5 认证流程2.6 证书样本 三、《网络关键设备和网络安全专用产品安全认证证书》3.1 背景3.2 法律法规依据3.3 检测机构3.4安全认证和安全检测依据标准3.5 认证…...

win10 安装多个版本的python

1,安装python3.9 和python3.10 2, 安装完之后分别打开两个版本的Python的安装目录(第一层目录),把pythonw.exe分别重命名为pythonw_39.exe和pythonw_310.exe,把python.exe复制一份,并分别重命名为python_…...

【ORACLE】数据备份

Oracle数据库备份是确保数据安全和可靠性的重要环节。Oracle提供了多种备份方法,包括冷备份、热备份、逻辑备份(如使用expdp和impdp)以及使用RMAN(Recovery Manager)进行物理备份。 冷备份:在数据库关闭的状…...

[Golang] goroutine

[Golang] goroutine 文章目录 [Golang] goroutine并发进程和线程协程 goroutine概述如何使用goroutine 并发 进程和线程 谈到并发,大多都离不开进程和线程,什么是进程、什么是线程? 进程可以这样理解:进程就是运行着的程序&…...

【前端】JavaScript高级教程:函数高级——执行上下文与执行上下文栈

文章目录 遍历提升与函数提升执行上下文执行上下文栈(1)执行上下文栈(2)面试题 遍历提升与函数提升 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>01_变量提升与函数提升</title> </head&…...

【阻抗管传递函数法】频域声压,即复声压是指什么

在阻抗管传递函数法中提到的“频域声压数据”&#xff0c;是通过对传声器测得的“时域声压信号”进行快速傅里叶变换&#xff08;FFT&#xff09;后得到的结果。 具体来说&#xff0c;这些频域声压数据指的是传声器测量的声压随时间变化的数据&#xff0c;经过傅里叶变换后&am…...

Python青少年简明教程:类和对象入门

Python青少年简明教程&#xff1a;类和对象入门 Python支持多种编程范式&#xff08;programming paradigms&#xff09;&#xff0c;即支持多种不同的编程风格和方法。初学者开始重点学习关注的编程范式&#xff0c;一般而言是面向过程编程和面向对象编程。面向过程编程&#…...

【vue+el-table】表格操作列宽度跟随按钮个数自适应, 方法封装全局使用

效果图 以上图片分别代表不同用户权限下所能看到的按钮个数, 操作列宽度也会自适应宽度, 就不会一直处于最大宽度, 导致其他权限用户看到的页面出现大量留白问题. 目录 解决方法解决过程中可能出现的问题width赋值时为什么不放update()中btnDom为什么不能直接调用forEach为…...

OpenAI发布全新o1 AI模型具备推理能力

&#x1f989; AI新闻 &#x1f680; OpenAI发布全新o1 AI模型具备推理能力 摘要&#xff1a;OpenAI推出新AI模型o1&#xff0c;具备推理能力&#xff0c;旨在比人类更快地解决复杂问题。o1与o1-mini版本同时发布&#xff0c;前者训练成本较高&#xff0c;但在编程和多步骤问…...

如何在本地部署大语言模型

近年来&#xff0c;随着大语言模型&#xff08;如GPT、BERT等&#xff09;的迅速发展&#xff0c;越来越多的开发者和研究人员希望在本地环境中部署这些强大的模型&#xff0c;以便用于特定的应用场景或进行个性化的研究。本文将详细介绍如何在本地部署大语言模型&#xff0c;涵…...

秒懂:环境变量

前言 1.Linux当中70%以上的命令程序都是用C语言写的 2.执行命令程序和运行自己写的程序没有任何区别 3.自己程序运行必须要带路径&#xff08;绝对/相对都可&#xff09; 4. 系统指令可带可不带&#xff08;带不要瞎带&#xff09; 变量具有全局特性是…...

使用 @Param 注解标注映射关系

目录 1. 场景描述 2. SQL语句 3. 方法定义 4. Param注解的使用 5. 总结 在开发过程中&#xff0c;我们经常需要在Java应用程序中执行数据库操作&#xff0c;尤其是更新操作。在Spring Data JPA框架中&#xff0c;我们可以使用原生SQL语句来执行这些操作&#xff0c;并通过…...

Java学习中在打印对象时忘记调用 .toString() 方法或者没有重写 toString() 方法怎么办?

在 Java 编程中&#xff0c;toString() 方法对于调试、日志记录以及打印对象信息至关重要。然而&#xff0c;许多初学者在打印对象时可能会忘记调用 .toString() 方法&#xff0c;或者在自定义类中没有重写 toString() 方法&#xff0c;这可能导致输出结果不符合预期。 一、Ja…...

如何评估一个RAG(检索增强生成)系统-上篇

最近项目中需要评估业务部门搭建的RAG助手的效果好坏&#xff0c;看了一下目前业界一些评测的方法。目前分为两大类&#xff0c;基于传统的规则、机器学习的评测方法&#xff0c;基于大模型的评测方法。在这里做一些记录&#xff0c;上篇主要做评测方法的记录&#xff0c;下篇会…...

rust解说

Rust 是一种开源的系统编程语言&#xff0c;由 Mozilla 研究院开发&#xff0c;旨在提供高性能、内存安全且并发性良好的编程体验。 Rust 于 2010 年由 Graydon Hoare 开始设计&#xff0c;并在 2015 年发布了第一个稳定版本。 Rust 的设计目标是解决 C 等传统系统编程语言在…...

Elasticsearch 开放 inference API 为 Hugging Face 添加了原生分块支持

作者&#xff1a;来自 Elastic Max Hniebergall 借助 Elasticsearch 开放推理 API&#xff0c;你可以使用 Hugging Face 的推理端点&#xff08;Inference Endpoints&#xff09;在 Elasticsearch 之外执行推理。这样你就可以使用 Hugging Face 的可扩展基础架构&#xff0c;包…...

Jenkins部署若依项目

一、配置环境 机器 jenkins机器 用途&#xff1a;自动化部署前端后端&#xff0c;前后端自动化构建需要配置发送SSH的秘钥和公钥&#xff0c;同时jenkins要有nodejs工具来进行前端打包&#xff0c;maven工具进行后端的打包。 gitlab机器 用途&#xff1a;远程代码仓库拉取和…...

ELK笔记

要搞成这样就需要钱来买服务器 开发人员一般不会给服务器权限&#xff0c;不能到服务器上直接看日志&#xff0c;所以通过ELK看日志。不让开发登录服务器。即使你查出来是开发的问题&#xff0c;费时间&#xff0c;而且影响了业务了&#xff0c;就是运维的问题 开发也不能登录…...

计算机网络 --- 计算机网络的分类

一、计算机网络分类 1.1 按分布范围分类 举例&#xff1a;广域网&#xff08;WAN&#xff09;、局域网&#xff08;LAN&#xff09; 举例&#xff1a;个域网&#xff08;PAN&#xff09; 1.2 按传输技术分类 广播式网络――当一台计算机发送数据分组时&#xff0c;广播范围…...

三维动画|创意无限,让品牌传播更精彩!

随着三维动画技术的不断成熟&#xff0c;三维动画宣传片能够很好地宣传品牌、推广产品&#xff0c;因而慢慢地受到不少企业的青睐&#xff0c;成为品牌最常用的一种宣传方式。 三维动画宣传片作为艺术感极高的宣传视频有强烈的节奏感&#xff0c;而且具有风趣、易懂等特点&…...

欧零导航系统正式版,功能强大,可直接运营

欧零导航系统正式版&#xff0c;带广告位/导航分类/可直接运营 本系统采用PHPMySQL技术开发 拥有独立的安装和后台系统 后台采用BootstripMDUI框架 前台使用响应式界面&#xff0c;自适应各种屏幕 代码免费下载&#xff1a;百度网盘...

了解变压器耦合电压开关 D类放大器

在本文中&#xff0c;我们将讨论另一种 D 类配置&#xff1a;变压器耦合电压切换 (TCVS) 放大器。TCVS 放大器的原理图如图 1 所示。 变压器耦合电压开关 D 类放大器的示意图。 图 1.变压器耦合电压开关 D 类放大器。 在本文中&#xff0c;我们将探索该放大器的工作原理&…...

openssh移植:精致的脚本版

前置文章&#xff1a; busybox移植&#xff1a;全能脚本版-CSDN博客 zlib交叉编译-CSDN博客 openssl移植:精致的脚本版-CSDN博客 源码下载 官网&#xff1a;http://www.openssh.com/ 下载了一个很新的版本 ftp://mirrors.sonic.net/pub/OpenBSD/OpenSSH/portable/openss…...

3C电子胶黏剂在手机制造方面有哪些关键的应用

3C电子胶黏剂在手机制造方面有哪些关键的应用 3C电子胶黏剂在手机制造中扮演着至关重要的角色&#xff0c;其应用广泛且细致&#xff0c;覆盖了手机内部组件的多个层面&#xff0c;确保了设备的可靠性和性能。以下是电子胶在手机制造中的关键应用&#xff1a; 手机主板用胶&…...

Oracle数据库中的动态SQL(Dynamic SQL)

Oracle数据库中的动态SQL是一种在运行时构建和执行SQL语句的技术。与传统的静态SQL&#xff08;在编写程序时SQL语句就已经确定&#xff09;不同&#xff0c;动态SQL允许开发者在程序执行过程中根据不同的条件或用户输入来构建SQL语句。这使得动态SQL在处理复杂查询、存储过程中…...

Python判断两张图片的相似度

在Python中&#xff0c;判断两张以numpy的ndarray格式存储的图片的相似度&#xff0c;通常可以通过多种方法来实现&#xff0c;包括但不限于直方图比较、像素差比较、结构相似性指数&#xff08;SSIM&#xff09;、特征匹配等。以下是一些常见方法的简要介绍和示例代码。 1. 像…...

MySQL高级功能-窗口函数

背景 最近遇到需求&#xff0c;需要对数据进行分组排序并获取每组数据的前三名。 一般涉及到分组&#xff0c;第一时间就是想到使用group by对数据进行分组&#xff0c;但这样分组&#xff0c;到最后其实只能获取到每组数据中的一条记录。 在需要获取每组里面的多条记录的时候…...

9.12总结

今天学了树状dp和tarjan 树状dp 树状dp&#xff0c;是一种在树形数据结构上应用的动态规划算法。动态规划&#xff08;DP&#xff09;通常用于解决最优化问题&#xff0c;通过将问题分解为相对简单的子问题来求解。在树形结构中&#xff0c;由于树具有递归和子结构的特性&…...