【图像处理】使用 Python 进行图像增强

一、说明

        图像增强技术的深度和复杂性往往在一系列捕获和共享中被忽视。从傅里叶变换到白平衡和直方图处理,各种方法都可以将普通照片转换为引人注目的图像。这篇博文旨在解开这些技术。

        我在节日期间拍了一张照片,在夜间庆祝活动中。遗憾的是,图像中央有一束破坏性的光束。通过应用一系列增强技术,我们对消除这种光线持乐观态度,以实现更平衡和吸引人的构图。

二、傅里叶变换的魔力

        如果图像可以说一种语言,那就是数学,傅里叶变换就是语法。该数学工具将图像从空间域转换为频域。它将图像分解为正弦和余弦分量,表示图像中像素亮度变化的频率。

        为什么这很重要?好吧,许多图像增强技术,例如滤波和压缩,在频域中执行得更好。这些技术可以消除噪声,增强边缘,甚至压缩图像以实现更高效的存储和传输。完成所需的增强后,可以应用逆傅里叶变换将图像转换回空间域,使其再次可见。

        不幸的是,傅里叶变换技术对我的特定图像无效,尽管它确实证明对月球轨道这一不同的图像有益。

import numpy as np
import matplotlib.pyplot as plt
from skimage.io import imread, imshow
from skimage.color import rgb2gray# Load and transform image
orbiter = rgb2gray(imread('lunar_orbiter.jpg'))
orbiter_fft = np.fft.fftshift(np.fft.fft2(orbiter))orbiter_fft2 = orbiter_fft.copy()# mask vertical component (scan lines)
orbiter_fft2[:280,orbiter_fft.shape[1]//2] = 1 
orbiter_fft2[-280:,orbiter_fft.shape[1]//2] = 1 # Create 2 x 2 grid for plots
fig, axs = plt.subplots(2, 2, figsize=(12, 12))# Original Image
axs[0, 0].imshow(orbiter, cmap='gray')
axs[0, 0].set_title('Original Image')
axs[0, 0].axis('off')# Transformed Image (FFT)
axs[0, 1].imshow(np.log(abs(orbiter_fft)), cmap='gray')
axs[0, 1].set_title('Transformed Image (FFT)')
axs[0, 1].axis('off')# FFT with Masked Vertical Component
axs[1, 0].imshow(np.log(abs(orbiter_fft2)), cmap='gray')
axs[1, 0].set_title('FFT with Masked Vertical Component')
axs[1, 0].axis('off')# Inverse FFT of Masked Image
axs[1, 1].imshow(abs(np.fft.ifft2(orbiter_fft2)), cmap='gray')
axs[1, 1].set_title('Inverse FFT of Masked Image')
axs[1, 1].axis('off')plt.tight_layout()
plt.show()

三、白色平衡:增强本色

        白平衡是一种有影响力的技术,能够显着改变图像的美感。这个过程的本质在于调整照片中的颜色,以便现实中的白色物品在图片中也被描绘成白色。这是一个至关重要的步骤,因为光源的颜色可能会有很大差异,从而影响照片中颜色的感知方式。

        通过确保图像中的颜色准确一致,白平衡可为照片带来更大的真实性,无论拍摄照片时的照明条件如何。大多数现代相机都配备了自动白平衡设置,但对此过程的更深入理解使摄影师能够手动进行调整以获得出色的效果。这可以显着提高照片的美学质量,使其与肉眼看到的场景更紧密地对齐。

        但是,并非所有图像都能从白平衡的使用中受益。在某些情况下,就像我拥有的特定图像一样,这些技术可能不会带来显着的增强。为了说明白平衡的力量,我将分享另一个例子,它大大提高了图像质量,展示了它的潜在有效性。

import matplotlib.pyplot as plt
import numpy as np
from skimage import utildef plot_channel_histogram(ax, image, percentile):for channel, color in enumerate('rgb'):channel_values = image[:, :, channel]ax.step(np.arange(256),np.bincount(channel_values.flatten(),minlength=256) / channel_values.size,c=color, label=color)ax.axvline(np.percentile(channel_values, percentile),ls='--', c=color)ax.set_xlim(0, 255)ax.set_title(f'Color Channel with {percentile}th Percentile')ax.set_xlabel('Channel Value')ax.set_ylabel('Fraction of Pixels')ax.legend()def apply_white_patch(image, percentile):# Convert and normalize the imagewp = util.img_as_ubyte((image * 1.0 / np.percentile(image,percentile, axis=(0, 1))).clip(0, 1))# Create subplotsfig, axs = plt.subplots(1, 3, figsize=(15, 5))axs[0].imshow(image)axs[0].set_title('Original Image')axs[1].imshow(wp)axs[1].set_title(f'Image with {percentile}th Percentile Normalization')plot_channel_histogram(axs[2], image, percentile)plt.show()def main():percentiles = [99, 90]for percentile in percentiles:apply_white_patch(image, percentile)

四、直方图操作:平衡对比度和亮度的艺术

        直方图用作图像中色调分布的图形说明。它们提供了对图片中每个亮度水平的像素数的见解,从而帮助摄影师理解照片的曝光和对比度。

        通过利用直方图处理技术,摄影师可以大大增强最初显示对比度差的图像。这些方法使他们能够微调亮度和对比度,从而提高照片的整体质量。

        但是,请务必记住,直方图操作的有效性可能因图像而异。在我的特定情况下,即使我采用了直方图操作,该技术也没有为我的图像产生所需的增强效果。尽管如此,为了展示直方图操作的潜力,我将举一个例子,说明这种方法在提高图像质量方面非常成功。

from skimage import color, exposure
import numpy as np
import matplotlib.pyplot as plt# Original image
image = dark_image.copy()# Convert the image to grayscale
gray_image = color.rgb2gray(image)# Compute the histogram and cumulative distribution function
# (CDF) of the gray image
hist, bin_centers = exposure.histogram(gray_image)
cdf = np.cumsum(hist) / np.sum(hist)# Split the color image into separate RGB channels
red_channel = image[:, :, 0]
green_channel = image[:, :, 1]
blue_channel = image[:, :, 2]# Compute color multipliers from CDF for each channel
multipliers = 0.5 + 0.5 * np.concatenate([cdf]*3)
red_mult = multipliers[0]
green_mult = multipliers[1]
blue_mult = multipliers[2]# Apply global histogram equalization to each channel
red_eq = exposure.equalize_hist(red_channel)
green_eq = exposure.equalize_hist(green_channel)
blue_eq = exposure.equalize_hist(blue_channel)# Adjust channels by corresponding multipliers
red_final = red_eq * red_mult
green_final = green_eq * green_mult
blue_final = blue_eq * blue_mult# Recombine the channels into a color image
adjusted_image = np.stack((red_final, green_final, blue_final), axis=-1)# Create a 4x2 subplot for original and adjusted channels and images
fig, axs = plt.subplots(4, 2, figsize=(10, 20))channels = [('Red', red_channel, red_eq), ('Green', green_channel, green_eq),('Blue', blue_channel, blue_eq)
]for i, (color_name, original, adjusted) in enumerate(channels):axs[i, 0].set_title(f'Original {color_name} Channel')axs[i, 0].imshow(original, cmap=f'{color_name}s')axs[i, 1].set_title(f'Adjusted {color_name} Channel')axs[i, 1].imshow(adjusted, cmap=f'{color_name}s')# Plot the original and final combined images
axs[3, 0].set_title('Original Image')
axs[3, 0].imshow(image)
axs[3, 1].set_title('Adjusted Image')
axs[3, 1].imshow(adjusted_image)# Show the subplots
plt.show()

五、结论

        图像增强技术,包括傅里叶变换、白平衡和直方图操作,是可以将摄影提升到新高度的强大工具。这些技术中的每一种都有其独特的优势和应用,使图像增强成为一个迷人但复杂的过程。例如,我在圣诞节假期拍摄的一张照片具有破坏性的光线,这些技术都无法单独消除。这凸显了图像增强的复杂性和对定制方法的需求。

        对这些技术的实验揭示了它们各自的潜力。虽然傅里叶变换和白平衡没有为我的圣诞图像提供预期的结果,但它们在增强其他照片方面发挥了重要作用。同样,直方图操作并没有显着改善我的图像,但对另一张图像非常有效。这种经验强调了了解这些方法的独特功能并知道何时应用每种方法的重要性。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HarmonyOS学习路之方舟开发框架—学习ArkTS语言(基本语法 一)

初识ArkTS语言 ArkTS是HarmonyOS优选的主力应用开发语言。ArkTS围绕应用开发在TypeScript(简称TS)生态基础上做了进一步扩展,继承了TS的所有特性,是TS的超集。因此,在学习ArkTS语言之前,建议开发者具备TS语…

【已解决】html元素如何使字体占据相同的元素显得整齐

本博文源于自身的亲身实践,让html的文本元素对齐,如果不让其对齐就会变得很丑陋,如下图,那么如何设置才能让元素占据相同呢? 文章目录 1、问题来源2、问题解决思路3、问题解决方案4、问题完整源码及效果 1、问题来源 …

2023秋招,网络安全面试题

Hello,各位小伙伴,我作为一名网络安全工程师曾经在秋招中斩获🔟个offer🌼,并在国内知名互联网公司任职过的职场老油条,希望可以将我的面试的网络安全大厂面试题和好运分享给大家~ 转眼2023年秋招已经到了金…

ASEMI快恢复二极管MUR2080CT参数, MUR2080CT规格

编辑-Z MUR2080CT参数描述: 型号:MUR2080CT 最大峰值反向电压(VRRM):800V 最大RMS电压(VRMS):430V 最大直流阻断电压VR(DC):800V 平均整流正向电流(IF):20A 非重复峰值浪涌电流(IFSM):15…

Spark编程-键值对RDD(K,V)创建及常用操作

简述 SparkRDD中可以包含任何类型的对象,在实际应用中,“键值对”是一种比较常见的RDD元素类型,分组和聚合操作中经常会用到,尤其是groupByKey和reduceByKey。 Spark操作中经常会用到“键值对RDD”(Pair RDD&a…

pdf文档加水印怎么弄?用这款软件很方便

在工作中,我们经常需要将PDF文件发送给他人,但无法保证文件内容不被窃取,因此需要添加水印来保证文件的安全性。如果你不知道如何给PDF文件添加水印,以下两款软件可以帮助你轻松实现,一起来看看吧! 方法一&…

ELK搭建

ELK介绍: ELK是一组开源工具的缩写,它由Elasticsearch、Logstash和Kibana三个组件组成,用于处理、分析和可视化大量日志数据。 入门级ELK搭建(无Docker环境) 安装前准备 1.获取安装包 https://artifacts.elastic…

C语言进阶之通讯录的实现(静态版和动态版)以及动态内存管理

通讯录的实现及动态内存管理 1.通讯录实现要求2.静态版通讯录实现2.1 contact.h文件实现2.2 contact.c文件实现2.3 main.c文件实现2.4 静态版通讯录全部文件代码 3.动态内存管理3.1 为什么存在动态内存分配3.2 动态内存函数的介绍3.3 常见的动态内存错误3.4 C/C程序的内存开辟3…

微服务系列文章之 nginx负载均衡

nginx负载均衡 负载均衡建立在现有网络结构之上,提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽,增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。 随着网站的发展,服务器压力越来越大,我们可能首先会将数…

Wi-Fi 相关概念

Wi-Fi 相关概念 802.11 Wi-Fi 标准及其含义频宽 和 带宽 的概念20MHz与40MHz的区别2.4G 频段2.4G的频道编号和中心频率 5G WiFi 频段中国开放的的5G WiFi频段:5G的频道编号和中心频率: 802.11历史进程一、802.11重要发展二、802.11协议族 参考 802.11 Wi…

2023下半年软考高级系统架构设计师怎么报名?

软考高级系统架构设计师报名时间: 广西2023下半年软考高级系统架构设计师报名时间:8月15日8:00至8月24日17:00 广东2023下半年软考高级系统架构设计师报名时间:8月16日9:00-8月24日17:00 甘肃2023下半年软考高级系统架构设计师报名时间&am…

AcWing 107. 超快速排序—逆序对

问题链接: AcWing 107. 超快速排序 问题描述 分析 这道题考查的算法不难,就只是利用归并排序来求逆序对的数量,但是主要是如何分析问题,如何能从问题中看出来和逆序对数量有关,现在的题目基本上很少是那种模板算法题了&#xff…