【OpenCV实现图像:用OpenCV图像处理技巧之巧用直方图】

文章目录

    • 概要
    • 前置条件
    • 统计数据分析
    • 直方图均衡化原理
    • 小结

概要

图像处理是计算机视觉领域中的重要组成部分,而直方图在图像处理中扮演着关键的角色。如何巧妙地运用OpenCV库中的图像处理技巧,特别是直方图相关的方法,来提高图像质量、改善细节以及调整曝光。
通过对图像的直方图进行分析和调整,能够优化图像的对比度、亮度和色彩平衡,从而使图像更具可视化效果。

直方图是一种统计图,用于表示图像中像素灰度级别的分布情况。在OpenCV中,可以使用直方图来了解图像的整体亮度分布,从而为后续处理提供基础。

OpenCV库中的函数,如cv2.calcHist和cv2.equalizeHist等,对图像的直方图进行均衡化。直方图均衡化是一种有效的方法,通过重新分配像素的强度值,使图像的亮度分布更均匀,提高图像的对比度和细节。

直方图匹配的应用,通过将目标图像的直方图调整到参考图像的直方图,实现两者之间的色彩一致性。这在图像配准和合成中有广泛的应用,提高了图像处理的精度和效果。

在低光照条件下拍摄图像的处理技巧。通过分析图像的直方图,可以采取针对性的方法,提高低光照图像中物体的可见性,改善图像的细节,并校正曝光过度或曝光不足的问题。

前置条件

一般来说,通过合理利用一些直方图的技巧,可以用于提高低光照拍摄图像中物体的可见性,改善图像的细节,以及校正曝光过度或曝光不足的图像。

import numpy as np
import matplotlib.pyplot as plt
from skimage.color import rgb2gray
from skimage.exposure import histogram, cumulative_distribution
from skimage import filters
from skimage.color import rgb2hsv, rgb2gray, rgb2yuv
from skimage import color, exposure, transform
from skimage.exposure import histogram, cumulative_distributionfrom skimage.io import imread# Load the image & remove the alpha or opacity channel (transparency)
dark_image = imread('img.png')[:,:,:3]# Visualize the image
plt.figure(figsize=(10, 10))
plt.title('Original Image: Plasma Ball')
plt.imshow(dark_image)
plt.show()

在这里插入图片描述
上述图像是在光照不足下进行拍摄的,接着我们就来通过控制直方图,来改善我们的视觉效果。

统计数据分析

使用以下代码:


def calc_color_overcast(image):# Calculate color overcast for each channelred_channel = image[:, :, 0]green_channel = image[:, :, 1]blue_channel = image[:, :, 2]# Create a dataframe to store the resultschannel_stats = pd.DataFrame(columns=['Mean', 'Std', 'Min', 'Median', 'P_80', 'P_90', 'P_99', 'Max'])# Compute and store the statistics for each color channelfor channel, name in zip([red_channel, green_channel, blue_channel], ['Red', 'Green', 'Blue']):mean = np.mean(channel)std = np.std(channel)minimum = np.min(channel)median = np.median(channel)p_80 = np.percentile(channel, 80)p_90 = np.percentile(channel, 90)p_99 = np.percentile(channel, 99)maximum = np.max(channel)channel_stats.loc[name] = [mean, std, minimum, median, p_80, p_90, p_99, maximum]return channel_stats

完整代码:

import numpy as np
import matplotlib.pyplot as plt
from skimage.color import rgb2gray
from skimage.exposure import histogram, cumulative_distribution
from skimage import filters
from skimage.color import rgb2hsv, rgb2gray, rgb2yuv
from skimage import color, exposure, transform
from skimage.exposure import histogram, cumulative_distribution
import pandas as pdfrom skimage.io import imread# Load the image & remove the alpha or opacity channel (transparency)
dark_image = imread('img.png')[:,:,:3]# Visualize the image
plt.figure(figsize=(10, 10))
plt.title('Original Image: Plasma Ball')
plt.imshow(dark_image)
plt.show()def calc_color_overcast(image):# Calculate color overcast for each channelred_channel = image[:, :, 0]green_channel = image[:, :, 1]blue_channel = image[:, :, 2]# Create a dataframe to store the resultschannel_stats = pd.DataFrame(columns=['Mean', 'Std', 'Min', 'Median','P_80', 'P_90', 'P_99', 'Max'])# Compute and store the statistics for each color channelfor channel, name in zip([red_channel, green_channel, blue_channel],['Red', 'Green', 'Blue']):mean = np.mean(channel)std = np.std(channel)minimum = np.min(channel)median = np.median(channel)p_80 = np.percentile(channel, 80)p_90 = np.percentile(channel, 90)p_99 = np.percentile(channel, 99)maximum = np.max(channel)channel_stats.loc[name] = [mean, std, minimum, median, p_80, p_90, p_99, maximum]return channel_stats
# 调用函数并传入图像
result_stats = calc_color_overcast(dark_image)# 打印结果
print(result_stats)

在这里插入图片描述
进而我们可以使用以下代码,来生成上述图像的直方图分布:

# Histogram plot
dark_image_intensity = img_as_ubyte(rgb2gray(dark_image))
freq, bins = histogram(dark_image_intensity)
plt.step(bins, freq*1.0/freq.sum())
plt.xlabel('intensity value')
plt.ylabel('fraction of pixels');
plt.show()  # 添加这一行以显示直方图

得到直方图可视化效果如下:
在这里插入图片描述
通过直方图的观察,可以注意到图像的像素平均强度似乎非常低,这进一步证实了图像的整体暗淡和曝光不足的情况。直方图展示了图像中像素强度值的分布情况,而大多数像素具有较低的强度值。这是有道理的,因为低像素强度值意味着图像中的大多数像素非常暗或呈现黑色。这样的观察有助于定量了解图像的亮度分布,为进一步的图像增强和调整提供了重要的线索。

直方图均衡化原理

直方图均衡化的基本原理是通过线性化图像的累积分布函数(CDF)来提高图像的对比度。实现这一目标的方法是将图像中每个像素的强度值映射到一个新的值,使得新的强度分布更加均匀。

可以通过以下几个步骤实现CDF的线性化:

将图像转换为灰度图:
如果图像不是灰度图,代码会将其转换为灰度图。这是因为直方图均衡化主要应用于灰度图。

计算累积分布函数(CDF):
通过计算图像像素的强度值的累积分布函数,可以了解每个强度值在图像中出现的累积频率。

绘制实际和目标CDF:
使用蓝色实线表示实际的CDF,使用红色实线表示目标CDF。目标CDF是一个线性分布,通过均匀分布来提高对比度。

绘制示例查找表:
绘制一个示例查找表,展示了像素强度值从原始值映射到目标值的过程。

自定义绘图:
对绘图进行自定义,包括设置坐标轴范围、标签和标题等。

import numpy as np
import matplotlib.pyplot as plt
from skimage.color import rgb2hsv, rgb2gray, rgb2yuv
from skimage.exposure import histogram, cumulative_distribution
import pandas as pd
from skimage import img_as_ubyte
from skimage.io import imread# Load the image & remove the alpha or opacity channel (transparency)
dark_image = imread('img.png')[:,:,:3]# Visualize the image
plt.figure(figsize=(10, 10))
plt.title('Original Image: Plasma Ball')
plt.imshow(dark_image)
plt.show()def calc_color_overcast(image):# Calculate color overcast for each channelred_channel = image[:, :, 0]green_channel = image[:, :, 1]blue_channel = image[:, :, 2]# Create a dataframe to store the resultschannel_stats = pd.DataFrame(columns=['Mean', 'Std', 'Min', 'Median','P_80', 'P_90', 'P_99', 'Max'])# Compute and store the statistics for each color channelfor channel, name in zip([red_channel, green_channel, blue_channel],['Red', 'Green', 'Blue']):mean = np.mean(channel)std = np.std(channel)minimum = np.min(channel)median = np.median(channel)p_80 = np.percentile(channel, 80)p_90 = np.percentile(channel, 90)p_99 = np.percentile(channel, 99)maximum = np.max(channel)channel_stats.loc[name] = [mean, std, minimum, median, p_80, p_90, p_99, maximum]return channel_statsdef plot_cdf(image):# Convert the image to grayscale if neededif len(image.shape) == 3:image = rgb2gray(image[:, :, :3])# Compute the cumulative distribution functionintensity = np.round(image * 255).astype(np.uint8)freq, bins = cumulative_distribution(intensity)# Plot the actual and target CDFstarget_bins = np.arange(256)target_freq = np.linspace(0, 1, len(target_bins))plt.step(bins, freq, c='b', label='Actual CDF')plt.plot(target_bins, target_freq, c='r', label='Target CDF')# Plot an example lookupexample_intensity = 50example_target = np.interp(freq[example_intensity], target_freq, target_bins)plt.plot([example_intensity, example_intensity, target_bins[-11], target_bins[-11]],[0, freq[example_intensity], freq[example_intensity], 0],'k--',label=f'Example lookup ({example_intensity} -> {example_target:.0f})')# Customize the plotplt.legend()plt.xlim(0, 255)plt.ylim(0, 1)plt.xlabel('Intensity Values')plt.ylabel('Cumulative Fraction of Pixels')plt.title('Cumulative Distribution Function')return freq, bins, target_freq, target_bins
# 调用函数并传入图像
result_stats = calc_color_overcast(dark_image)# 打印结果
print(result_stats)
# Histogram plot
# Histogram plot
dark_image_intensity = img_as_ubyte(rgb2gray(dark_image))
freq, bins = histogram(dark_image_intensity)
plt.step(bins, freq*1.0/freq.sum())
plt.xlabel('intensity value')
plt.ylabel('fraction of pixels')
plt.show()  # 添加这一行以显示直方图# 调用 plot_cdf 函数并传入图像
plot_cdf(dark_image)
plt.show()  # 添加这一行以显示CDF图形

在这里插入图片描述

直方图均衡化实现结果:

import numpy as np
import matplotlib.pyplot as plt
from skimage.color import rgb2gray
from skimage.exposure import histogram, cumulative_distribution, equalize_hist
from skimage import img_as_ubyte
from skimage.io import imread# Load the image & remove the alpha or opacity channel (transparency)
dark_image = imread('img.png')[:,:,:3]# Visualize the original image
plt.figure(figsize=(10, 10))
plt.title('Original Image: Plasma Ball')
plt.imshow(dark_image)
plt.show()# Convert the image to grayscale
gray_image = rgb2gray(dark_image)# Apply histogram equalization
equalized_image = equalize_hist(gray_image)# Display the original and equalized images
plt.figure(figsize=(15, 7))
plt.subplot(1, 2, 1)
plt.title('Original Image')
plt.imshow(gray_image, cmap='gray')plt.subplot(1, 2, 2)
plt.title('Equalized Image')
plt.imshow(equalized_image, cmap='gray')plt.show()

在这里插入图片描述

扩展:
上面展示了最基本的直方图操作类型,接着让我们尝试不同类型的CDF技术,看看哪种技术适合给定的图像


# Linear
target_bins = np.arange(256)
# Sigmoid
def sigmoid_cdf(x, a=1):return (1 + np.tanh(a * x)) / 2
# Exponential
def exponential_cdf(x, alpha=1):return 1 - np.exp(-alpha * x)# Power
def power_law_cdf(x, alpha=1):return x ** alpha
# Other techniques:
def adaptive_histogram_equalization(image, clip_limit=0.03, tile_size=(8, 8)):clahe = exposure.equalize_adapthist(image, clip_limit=clip_limit, nbins=256, kernel_size=(tile_size[0], tile_size[1]))return clahe
def gamma_correction(image, gamma=1.0):corrected_image = exposure.adjust_gamma(image, gamma)return corrected_image
def contrast_stretching_percentile(image, lower_percentile=5, upper_percentile=95):in_range = tuple(np.percentile(image, (lower_percentile, upper_percentile)))stretched_image = exposure.rescale_intensity(image, in_range)return stretched_imagedef unsharp_masking(image, radius=5, amount=1.0):blurred_image = filters.gaussian(image, sigma=radius, multichannel=True)sharpened_image = (image + (image - blurred_image) * amount).clip(0, 1)return sharpened_imagedef equalize_hist_rgb(image):equalized_image = exposure.equalize_hist(image)return equalized_imagedef equalize_hist_hsv(image):hsv_image = color.rgb2hsv(image[:,:,:3])hsv_image[:, :, 2] = exposure.equalize_hist(hsv_image[:, :, 2])hsv_adjusted = color.hsv2rgb(hsv_image)return hsv_adjusteddef equalize_hist_yuv(image):yuv_image = color.rgb2yuv(image[:,:,:3])yuv_image[:, :, 0] = exposure.equalize_hist(yuv_image[:, :, 0])yuv_adjusted = color.yuv2rgb(yuv_image)return yuv_adjusted

使用代码:

import numpy as np
import matplotlib.pyplot as plt
from skimage.io import imread
from skimage.color import rgb2gray
from skimage.exposure import histogram, cumulative_distribution
from skimage import exposure, color, filters# Load the image & remove the alpha or opacity channel (transparency)
dark_image = imread('img.png')[:, :, :3]# Visualize the original image
plt.figure(figsize=(10, 10))
plt.title('Original Image: Plasma Ball')
plt.imshow(dark_image)
plt.show()# Linear
target_bins = np.arange(256)
# Sigmoid
def sigmoid_cdf(x, a=1):return (1 + np.tanh(a * x)) / 2
# Exponential
def exponential_cdf(x, alpha=1):return 1 - np.exp(-alpha * x)# Power
def power_law_cdf(x, alpha=1):return x ** alpha
# Other techniques:
def adaptive_histogram_equalization(image, clip_limit=0.03, tile_size=(8, 8)):clahe = exposure.equalize_adapthist(image, clip_limit=clip_limit, nbins=256, kernel_size=(tile_size[0], tile_size[1]))return clahe
def gamma_correction(image, gamma=1.0):corrected_image = exposure.adjust_gamma(image, gamma)return corrected_image
def contrast_stretching_percentile(image, lower_percentile=5, upper_percentile=95):in_range = tuple(np.percentile(image, (lower_percentile, upper_percentile)))stretched_image = exposure.rescale_intensity(image, in_range)return stretched_imagedef unsharp_masking(image, radius=5, amount=1.0):blurred_image = filters.gaussian(image, sigma=radius, multichannel=True)sharpened_image = (image + (image - blurred_image) * amount).clip(0, 1)return sharpened_imagedef equalize_hist_rgb(image):equalized_image = exposure.equalize_hist(image)return equalized_imagedef equalize_hist_hsv(image):hsv_image = color.rgb2hsv(image[:,:,:3])hsv_image[:, :, 2] = exposure.equalize_hist(hsv_image[:, :, 2])hsv_adjusted = color.hsv2rgb(hsv_image)return hsv_adjusteddef equalize_hist_yuv(image):yuv_image = color.rgb2yuv(image[:,:,:3])yuv_image[:, :, 0] = exposure.equalize_hist(yuv_image[:, :, 0])yuv_adjusted = color.yuv2rgb(yuv_image)return yuv_adjusted
def apply_cdf(image, cdf_function, *args, **kwargs):# Convert the image to grayscalegray_image = rgb2gray(image)# Calculate the cumulative distribution function (CDF)intensity = np.round(gray_image * 255).astype(np.uint8)cdf_values, bins = cumulative_distribution(intensity)# Apply the specified CDF functiontransformed_cdf = cdf_function(cdf_values, *args, **kwargs)# Map the CDF values back to intensity valuestransformed_intensity = np.interp(intensity, cdf_values, transformed_cdf)# Rescale the intensity values to [0, 1]transformed_intensity = transformed_intensity / 255.0# Apply the transformation to the original imagetransformed_image = image.copy()for i in range(3):transformed_image[:, :, i] = transformed_intensityreturn transformed_image# Apply and visualize different CDF techniques
linear_image = apply_cdf(dark_image, lambda x: x)
sigmoid_image = apply_cdf(dark_image, sigmoid_cdf, a=1)
exponential_image = apply_cdf(dark_image, exponential_cdf, alpha=1)
power_law_image = apply_cdf(dark_image, power_law_cdf, alpha=1)
adaptive_hist_eq_image = adaptive_histogram_equalization(dark_image)
gamma_correction_image = gamma_correction(dark_image, gamma=1.5)
contrast_stretch_image = contrast_stretching_percentile(dark_image)
unsharp_mask_image = unsharp_masking(dark_image)
equalized_hist_rgb_image = equalize_hist_rgb(dark_image)
equalized_hist_hsv_image = equalize_hist_hsv(dark_image)
equalized_hist_yuv_image = equalize_hist_yuv(dark_image)# Visualize the results
plt.figure(figsize=(15, 15))
plt.subplot(4, 4, 1), plt.imshow(linear_image), plt.title('Linear CDF')
plt.subplot(4, 4, 2), plt.imshow(sigmoid_image), plt.title('Sigmoid CDF')
plt.subplot(4, 4, 3), plt.imshow(exponential_image), plt.title('Exponential CDF')
plt.subplot(4, 4, 4), plt.imshow(power_law_image), plt.title('Power Law CDF')
plt.subplot(4, 4, 5), plt.imshow(adaptive_hist_eq_image), plt.title('Adaptive Histogram Equalization')
plt.subplot(4, 4, 6), plt.imshow(gamma_correction_image), plt.title('Gamma Correction')
plt.subplot(4, 4, 7), plt.imshow(contrast_stretch_image), plt.title('Contrast Stretching')
plt.subplot(4, 4, 8), plt.imshow(unsharp_mask_image), plt.title('Unsharp Masking')
plt.subplot(4, 4, 9), plt.imshow(equalized_hist_rgb_image), plt.title('Equalized Histogram (RGB)')
plt.subplot(4, 4, 10), plt.imshow(equalized_hist_hsv_image), plt.title('Equalized Histogram (HSV)')
plt.subplot(4, 4, 11), plt.imshow(equalized_hist_yuv_image), plt.title('Equalized Histogram (YUV)')plt.tight_layout()
plt.show()

输出结果:
在这里插入图片描述

小结

有多种方法和技术可用于改善RGB图像的可视效果,但其中许多方法都需要手动调整参数。上述输出展示了使用不同直方图操作生成的亮度校正效果。通过观察,发现HSV调整、指数变换、对比度拉伸和unsharp masking的效果都是令人满意的。

HSV调整:
HSV调整涉及将RGB图像转换为HSV颜色空间并修改强度分量。这种技术似乎在提高图像可视化效果方面取得了令人满意的结果。

指数变换:
指数变换用于根据指数函数调整像素强度。这种方法在提高图像整体亮度和视觉吸引力方面表现出色。

对比度拉伸:
对比度拉伸旨在通过拉伸指定百分位范围内的强度值来增强图像对比度。结果表明,这种技术有效地提高了图像的视觉质量。

Unsharp Masking:
Unsharp masking涉及通过减去模糊版本来创建图像的锐化版本。应用unsharp masking似乎增强了图像的细节和边缘

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

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

相关文章

如何使用iPhone邮件客户端管理QQ邮箱?

如何使用iPhone邮件客户端管理QQ邮箱? 解决方案 之前按照QQ邮箱的提示,一直配置失败 解决方案 需要POP3/IMAP/SMTP/Exchange/CardDAV 授权码 然后登陆密码就是授权码 参考文章:参考

nmap原理与使用

kali的命令行中可以直接使用 nmap 命令,打开一个「终端」,输入 nmap 后回车,可以看到 nmap 的版本,证明 nmap 可用。 一、端口扫描 扫描主机的「开放端口」,在nmap后面直接跟主机IP(默认扫描1000个端口&am…

arcgis提取栅格有效边界

方法一:【3D Analyst工具】-【转换】-【由栅格转出】-【栅格范围】 打开一幅栅格数据,利用【栅格范围】工具提取其有效边界(不包含NoData值): 方法二:先利用【栅格计算器】将有效值赋值为1,得到…

什么是状态机?

什么是状态机? 定义 我们先来给出状态机的基本定义。一句话: 状态机是有限状态自动机的简称,是现实事物运行规则抽象而成的一个数学模型。 先来解释什么是“状态”( State )。现实事物是有不同状态的,例…

使用Jmeter进行http接口性能测试

在进行网页或应用程序后台接口开发时,一般要及时测试开发的接口能否正确接收和返回数据,对于单次测试,Postman插件是个不错的Http请求模拟工具。 但是Postman只能模拟单客户端的单次请求,而对于模拟多用户并发等性能测试&#xf…

Xilinx Artix7-100T低端FPGA解码MIPI视频,基于MIPI CSI-2 RX Subsystem架构实现,提供工程源码和技术支持

目录 1、前言免责声明 2、我这里已有的 MIPI 编解码方案3、本 MIPI CSI2 模块性能及其优缺点4、详细设计方案设计原理框图OV5640及其配置权电阻硬件方案MIPI CSI-2 RX SubsystemSensor Demosaic图像格式转换Gammer LUT伽马校正VDMA图像缓存AXI4-Stream toVideo OutHDMI输出 5、…

C++编写的多线程自动爬虫程序

以下是一个使用C编写的爬虫程序&#xff0c;用于爬取Python进行多线程跑数据的内容。本示例使用了Python的requests库来发送HTTP请求&#xff0c;并使用cheeseboy的爬虫ipIP库来设置爬虫ip信息。以下是详细代码和步骤&#xff1a; #include <iostream> #include <stri…

东莞松山湖数据中心|莞服务器托管的优势

东莞位于珠江三角洲经济圈&#xff0c;交通便利&#xff0c;与广州、深圳等大城市相邻&#xff0c;而且东莞是中国重要的制造业基地&#xff0c;有众多的制造业和科技企业集聚于此&#xff0c;随着互联网和数字化时代的到来&#xff0c;企业都向数字化转型&#xff0c;对于信息…

Django中Cookie和Session的使用

目录 一、Cookie的使用 1、什么是Cookie&#xff1f; 2、Cookie的优点 3、Cookie的缺点 4、Django中Cookie的使用 二、Session的使用 1、什么是Session&#xff1f; 2、Session的优点 3、Session的缺点 4、Django中Session的使用 三、Cookie和Session的对比 总结 D…

Vatee万腾科技决策力的引领创新:Vatee数字化视野的崭新天地

在数字时代的激烈竞争中&#xff0c;Vatee万腾以其科技决策力的引领&#xff0c;开创了数字化视野的崭新天地。这并不仅仅是一场技术的飞跃&#xff0c;更是一次对未来的深刻洞察和引领创新的勇敢实践。 Vatee万腾的科技决策力不仅仅停留在数据分析和算法的运用&#xff0c;更是…

idea maven 构建本地jar包及pom文件

1、设置模块build 本地输出路径 <build><defaultGoal>compile</defaultGoal><resources><resource><directory>${basedir}/src/main/resources</directory><includes><include>**/**</include></includes>…

OpenCV 实现透视变换

一&#xff1a;OpenCV透视变换的概念 仿射变换(affine transform)与透视变换(perspective transform)在图像还原、图像局部变化处理方面有重要意义。通常&#xff0c;在2D平面中&#xff0c;仿射变换的应用较多&#xff0c;而在3D平面中&#xff0c;透视变换又有了自己的一席之…

ceph修复pg inconsistent( scrub errors)

异常情况 1、收到异常情况如下: OSD_SCRUB_ERRORS 12 scrub errors PG_DAMAGED Possible data damage: 1 pg inconsistentpg 6.d is activeremappedinconsistentbackfill_wait, acting [5,7,4]2、查看详细信息 登录后复制 #ceph health detail HEALTH_ERR 12 scrub errors…

数据结构与算法之美学习笔记:18 | 散列表(上):Word文档中的单词拼写检查功能是如何实现的?

目录 前言散列思想散列函数散列冲突解答开篇 前言 本节课程思维导图&#xff1a; Word 的单词拼写检查功能&#xff0c;虽然很小但却非常实用。你有没有想过&#xff0c;这个功能是如何实现的呢&#xff1f;其实啊&#xff0c;一点儿都不难。只要你学完今天的内容&#xff0c;…

OpenAtom OpenHarmony三方库创建发布及安全隐私检测

OpenAtom OpenHarmony三方库&#xff08;以下简称“三方库”或“包”&#xff09;&#xff0c;是经过验证可在OpenHarmony系统上可重复使用的软件组件&#xff0c;可帮助开发者快速开发OpenHarmony应用。三方库根据其开发语言分为2种&#xff0c;一种是使用JavaScript和TypeScr…

Spark3.0中的AOE、DPP和Hint增强

1 Spark3.0 AQE Spark 在 3.0 版本推出了 AQE&#xff08;Adaptive Query Execution&#xff09;&#xff0c;即自适应查询执行。AQE 是 Spark SQL 的一种动态优化机制&#xff0c;在运行时&#xff0c;每当 Shuffle Map 阶段执行完毕&#xff0c;AQE 都会结合这个阶段的统计信…

如何在电脑和手机设备上编辑只读 PDF

我们大多数人更喜欢以 PDF 格式共享和查看文件&#xff0c;因为它更专业、更便携。但是&#xff0c;通常情况下您被拒绝访问除查看之外的内容编辑、复制或评论。如果您希望更好地控制您的 PDF 或更灵活地编辑它&#xff0c;请弄清楚为什么您的 PDF 是只读的&#xff0c;然后使用…

flutter逆向 ACTF native app

前言 算了一下好长时间没打过CTF了,前两天看到ACTF逆向有道flutter逆向题就过来玩玩啦,花了一个下午做完了.说来也巧,我给DASCTF十月赛出的逆向题其中一道也是flutter,不过那题我难度降的相当之低啦,不知道有多少人做出来了呢~ 还原函数名 flutter逆向的一大难点就是不知道l…

RTOS实时操作系统在嵌入式开发中的应用

随着各种嵌入式系统应用的日益复杂和对实时性要求的提高&#xff0c;使用实时操作系统&#xff08;RTOS&#xff09;成为嵌入式开发中的一种重要选择。STM32微控制器作为一种强大的嵌入式处理器&#xff0c;与各种RTOS相结合&#xff0c;能够提供更高效、可靠并且易于维护的系统…

linux 安装 mini conda,linux下安装 Miniconda

下载地址 https://docs.conda.io/projects/miniconda/en/latest/index.html 安装conda mkdir -p ~/miniconda3 wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda3/miniconda.sh bash ~/miniconda3/miniconda.sh -b -u -p ~/mini…