An Efficient and Self - Adapted Approach to the Sharpening of Color Images 论文解读

目录

      一、主要原理

     二、具体实现方法

1.RGB转HSV。无需多言,网络上很多介绍可以参考;

2. 确定最大叠加幅度 Δ

3边缘检测机制

4 用于去除孤立像素的低通滤波

5 亮度(V)通道的边缘锐化

6 HSV 到 RGB 的转换

三、算法效果


      一、主要原理

        《An Efficient and Self - Adapted Approach to the Sharpening of Color Images》是一篇关于彩色图像锐化的论文。该论文提出了一种高效且自适应的彩色图像锐化方法,旨在突出图像中的边缘和细节,同时保留图像的原始信息。

  1. 颜色模型转换:将待锐化的彩色图像转换到 HSV 颜色模型,仅对亮度(Value)通道进行锐化处理,而色调(Hue)和饱和度(Saturation)通道保持不变。这样可以在不改变颜色信息的前提下,对图像的亮度细节进行增强。
  2. 边缘像素检测:对亮度通道应用提出的边缘检测器和低通滤波器,以挑选出边界周围的像素。边缘检测器用于识别可能的边缘区域,低通滤波器则用于辅助确定边界像素,排除噪声干扰,从而准确地定位出需要进行锐化处理的像素。
  3. 像素调整:对于检测到的边缘或边界周围的像素进行调整,以锐化边界,而非边缘像素则保持不变。边缘像素的增量或减量幅度是基于图像的全局统计信息和待锐化像素的局部统计信息自适应确定的。这种自适应的调整方式能够根据图像的具体内容,灵活地调整锐化的强度,既能突出图像中的不连续性,又能保留图像中的大部分原始信息。
  4. 图像合成:将调整后的亮度通道与未改变的色调和饱和度通道进行整合,得到锐化后的彩色图像。通过这种方式,能够在保持颜色信息不变的情况下,有效地增强图像的视觉效果。
  5. 实验验证:通过在自然图像上进行大量实验,验证了所提出方法的有效性和高效性。实验结果表明,该方法能够在锐化图像的同时,保持图像的自然外观,并且在处理速度上也具有一定的优势。
  6. 主要流程图如下:

二、具体实现方法

1.RGB转HSV。无需多言,网络上很多介绍可以参考;
2. 确定最大叠加幅度 Δ

        由于人类视觉感知系统对亮度值的变化最为敏感 [19],因此在将图像从 RGB 颜色空间转换到 HSV 颜色空间后,仅使用亮度(Value)通道进行图像锐化处理。也就是说,我们只需得到锐化后的亮度通道,然后将调整后的亮度通道与原始的色调(Hue)通道和饱和度(Saturation)通道相结合,即可获得锐化后的彩色图像。

        在亮度通道的锐化过程中,我们将亮度通道视为灰度图像进行处理。为突出图像中的不连续区域(边缘),需要对那些待调整的边缘像素施加一个叠加幅度。我们知道,更大的叠加幅度能带来更好的锐化效果,但同时也可能导致边缘像素周围的亮度值出现饱和现象。为自动确定最大叠加幅度 Δ,本文结合待锐化的亮度(V)通道的全局统计信息来确定 Δ 的值,从而避免过度锐化的情况发生。

        为此,我们首先通过以下公式计算出亮度(V)通道的最小值(Min)、最大值(Max)、中间值(Mid)和平均值(Avg):

        公式中𝑉₍𝑖,𝑗₎是图像亮度通道的像素值表示方式,括号内(𝑖, 𝑗)对应图像像素的坐标(通常𝑖代表垂直方向的行索引,𝑗代表水平方向的列索引);𝑀(高度)和𝑁(宽度)是描述图像尺寸的常用参数,单位均为 “像素(pixel)”。

        为确定一个适用于各类待锐化图像的叠加幅度 Δ,以突出边缘或边界的不连续性,我们通过大量实验发现,取值为 Max/8(即亮度通道最大值的 1/8)是一个较好的选择。也就是说,当对这些边缘像素施加 Max/8 的增量或减量时,人类视觉系统通常能明显感知到锐化前后的差异。此外,对于亮度较高的图像,需要略大于 Max/8 的叠加幅度;而对于亮度较低的图像,略小于 Max/8 的叠加幅度已足够。因此,在选择最大叠加幅度 Δ 时,我们将 Max/8 乘以一个修正项 Avg/Mid(即亮度通道平均值与中间值的比值)。本文中的最大叠加幅度 Δ 最终由下式确定:

        其中,Max、Mid、Avg分别是八式中计算的值。

3边缘检测机制

        考虑到运行时性能,本文提出一种简单且有效的亮度(Value)通道边缘检测方法,我们将该边缘检测方法称为水平垂直微分器(Horizontal and Vertical Differentiator,简称 HVD)。对于像素𝑥周围的不连续性,可通过检测(𝑥, 𝑥_𝑊)与(𝑥, 𝑥_𝑁)之间的亮度差值来轻松识别(见下图 )。随后,通过判断下述公式中的第一个条件是否成立,即可确定像素𝑥是否位于边缘附近:

4 用于去除孤立像素的低通滤波

        在边缘检测过程中,使用所提出的一阶导数 HVD(水平垂直微分器)边缘检测器时,部分孤立像素也可能被检测为边缘附近像素。因此,在二值图像𝑔中(如式 (11) 所示),不仅会包含边缘信息,还可能混入椒盐噪声。为解决这一问题,需引入低通滤波过程,以排除这些孤立像素,避免其被误判为边缘附近像素。要判断某一像素𝑥是否为真实边缘像素,只需验证以下不等式是否成立:

        其中,𝑁₈(𝑥) 表示像素𝑥的 8 邻域(即与像素𝑥直接相邻的 8 个像素),𝜃ₗₚբ是一个预先定义的阈值,取值范围在 0 到 8 之间。也就是说,我们需要统计二值图像𝑔(见图 2)中像素𝑥的 8 个邻域内值为 1 的像素数量。若该数量小于预先设定的阈值𝜃ₗₚբ,则将像素𝑥判定为孤立点,并从边缘像素列表中剔除。

        本文中,𝜃ₗₚբ的取值被设定为 2。这样设定的原因是:对于采用所提 HVD(水平垂直微分器)方法检测边缘的场景,若有一条边缘线段经过像素𝑥,那么检测到的边缘像素数量至少为 2 个。因此,将𝜃ₗₚբ设为 2 是合理的。

5 亮度(V)通道的边缘锐化

        在该步骤中,对于检测出的边缘附近像素,通过增加或减少其亮度值来突出边缘的不连续性;而非边缘像素的亮度值则保持不变。为突出较小的边缘不连续性,同时避免图像过度锐化,叠加幅度需根据图像的局部统计信息进行自适应调整。

        因此,我们首先计算一个小型局部区域的亮度平均值(LocalMean,局部均值),该区域包含待调整的边缘像素𝑥及其 8 邻域像素(共 9 个像素,见图 2)。随后,比较像素𝑥的亮度值与 LocalMean 的大小:若像素𝑥的亮度值大于 LocalMean,则为其叠加一个增量𝛿ₓ;若像素𝑥的亮度值小于 LocalMean,则从其亮度值中减去𝛿ₓ。叠加值𝛿ₓ通过自适应方式确定,具体公式如下:

        其中,𝑠 是取值范围在 0 到 1 之间的缩放因子,用于控制锐化程度;Δ 为式 (9) 中求得的值。实际上,式 (12) 括号内的项用于实现局部自适应调整。显然,若像素𝑥的亮度值与局部均值(LocalMean)接近,则会得到更大的𝛿ₓ值(接近 Δ),这意味着对于不连续性较小的边缘,将采用更大的叠加幅度,反之亦然。像素𝑥的锐化后亮度值̂𝑥可由下式表示:

6 HSV 到 RGB 的转换

        在最后一步中,经过调整的亮度(Value)通道(现为高分辨率通道)会与低分辨率的色调(Hue)通道和饱和度(Saturation)通道相结合,得到锐化后的彩色图像(即高分辨率彩色图像)。此时,锐化后的彩色图像为 HSV 颜色空间格式;若有需要,可通过式 (4) 至式 (7) 将其转换到 RGB 颜色空间。

三、算法效果

<think>我们正在处理用户关于PySCF中对称性适应基组(symmetry-adapted basis)的问题,具体是关于轨道列表索引与不可约表示ID不匹配的问题。 在PySCF中,对称性处理是通过`pyscf.symm`模块实现的。分子轨道可以根据点群的不可约表示(irrep)进行分类。每个不可约表示有一个ID(通常用字母或数字表示,如'A1', 'B1'等),但在程序内部,这些ID被映射为一个整数索引(从0开始)。 用户遇到的索引不匹配问题可能是因为: 1. 不可约表示的ID(如'A1')和程序内部使用的索引(0,1,2,...)是不同的表示方式。 2. 在输出轨道信息时,程序可能使用了内部索引,而用户期望的是不可约表示的符号。 在PySCF中,分子轨道的对称性信息可以通过`scf_obj.mo_coeff`的`irrep_id`属性获得。这个属性是一个整数数组,表示每个分子轨道所属的不可约表示的内部索引。要得到对应的不可约表示符号,需要将这个内部索引映射到该点群的不可约表示符号上。 步骤: 1. 首先确定分子所属的点群(point group)。 2. 获取该点群的所有不可约表示的符号列表(按内部索引顺序排列)。 3. 将`mo_coeff.irrep_id`中的整数索引映射到不可约表示符号。 示例代码: ```python from pyscf import gto, scf, symm mol = gto.M(atom='H 0 0 0; F 0 0 1.1', basis='ccpvdz') mf = scf.RHF(mol).run() # 获取点群对象 pg = mol.groupname # 或者使用symm模块获取点群 # pg = symm.detect_symm(mol)[0] # 获取轨道的对称性信息(内部索引) irrep_ids = mf.mo_coeff.irrep_id # 获取该点群的不可约表示名称列表(按内部索引顺序) irrep_names = symm.label_irrep(mol, mf.mo_coeff, mf.mo_coeff, tol=1e-5) # 或者,也可以直接使用symm.irrep_name函数将内部索引转换为符号 # 注意:irrep_names列表的顺序与内部索引顺序一致 # 因此,对于每个轨道,我们可以用: # irrep_symbol = irrep_names[irrep_id] # 其中irrep_id是每个轨道对应的整数索引 # 打印前几个轨道的不可约表示 for i, irrep_id in enumerate(irrep_ids[:10]): # 使用irrep_names列表将索引转换为符号 irrep_symbol = irrep_names[irrep_id] print(f"Orbital {i}: irrep_id = {irrep_id}, irrep_symbol = {irrep_symbol}") ``` 注意:`irrep_names`是一个列表,其索引就是内部索引,元素是对应的不可约表示符号。因此,我们可以通过`irrep_names[irrep_id]`来获取符号。 如果用户发现打印出来的符号与内部索引不一致,可能是因为点群的不可约表示顺序在PySCF内部是固定的,而用户可能参考了不同的顺序(比如按字母顺序)。因此,需要以PySCF给出的顺序为准。 另外,有时用户可能会看到`mo_coeff.irrep_id`中的索引与点群不可约表示的标准ID(如D2h点群的Ag, B1u等)的编号不一致,这通常是因为在PySCF中,每个点群的不可约表示有一个固定的内部顺序。例如,在D2h点群中,不可约表示的顺序通常是:Ag, B1g, B2g, B3g, Au, B1u, B2u, B3u。因此,内部索引0对应Ag,1对应B1g,以此类推。 如果用户需要将符号转换为标准顺序(如按照字符顺序),可以自行对`irrep_names`进行排序,但要注意,这样会破坏与内部索引的对应关系。因此,在程序中处理时,建议使用PySCF的内部顺序。 常见问题: - 用户可能误以为`irrep_id`直接就是不可约表示的符号,但实际上它是一个整数索引。 - 不同的点群有不同的不可约表示数量和符号,因此映射关系取决于点群。 因此,用户需要根据上述步骤获取每个轨道对应的不可约表示符号,并确认是否与期望一致。如果仍然不一致,可能需要检查分子结构是否对称,或者对称性检测是否准确(有时需要调整对称性容忍度)。 另外,PySCF在对称性分析时,需要确保分子结构具有该点群对称性,否则对称性检测可能会出现偏差。 参考文献: [1] PySCF官方文档:http://pyscf.org [2] `pyscf.symm`模块的源代码:https://github.com/pyscf/pyscf/tree/master/pyscf/symm</think>### PySCF 中对称适应轨道索引与不可约表示ID不匹配问题分析 在 PySCF 中处理对称适应轨道时,轨道列表索引与不可约表示(irreducible representation)ID 不匹配是常见问题,主要由以下原因导致: #### 1. **对称性检测与基组排序** - PySCF 通过 `mol.groupname` 自动检测分子点群(如 D2h, C2v 等),但**基组排序规则**会影响轨道索引: ```python from pyscf import gto, scf, symm mol = gto.M(atom='O 0 0 0; H 0 1 0; H 0 0 1', basis='ccpvdz') mol.build() print("Detected point group:", mol.groupname) # 输出点群名称 ``` - 基函数按原子中心分组后,系统内部会按对称性重新排序,导致用户看到的索引与理论顺序不同[^1]。 #### 2. **不可约表示ID映射** - 不可约表示(如 A1g, B2u)在 PySCF 中映射为**整数索引**(从 0 开始),而非直接使用符号: ```python mf = scf.RHF(mol).run() mo_coeff = mf.mo_coeff # 分子轨道系数 irrep_ids = symm.label_orb_symm(mol, mo_coeff) # 获取轨道对称性ID列表 print("Irrep IDs:", irrep_ids) # 输出整数索引序列 ``` - 索引与符号的映射关系通过 `symm.irrep_name` 获取: ```python irrep_symbols = symm.irrep_name(mol.groupname, irrep_ids) print("Irrep symbols:", irrep_symbols) # 输出如 ['A1', 'B2', ...] ``` #### 3. **常见问题场景** - **索引偏移**:用户期望 ID=1 对应第一个不可约表示,但 PySCF 从 0 开始编号。 - **对称性破缺**:当分子结构不完全对称时,自动检测的点群可能不准确,导致映射错误。 - **自定义基组**:手动定义基组顺序会破坏内部对称性排序。 #### 4. **解决方案** **(1) 显式设置点群** ```python mol.symmetry = True mol.groupname = 'C2v' # 强制指定点群 mol.build() ``` **(2) 正确转换 ID 与符号** ```python # 获取点群所有不可约表示符号 all_irreps = symm.irrep_ids(mol.groupname) print("All irreps:", all_irreps) # 输出如 [0:'A1', 1:'A2', ...] # 通过索引获取符号 orbital_idx = 3 irrep_id = irrep_ids[orbital_idx] print(f"Orbital {orbital_idx}: id={irrep_id}, symbol={all_irreps[irrep_id]}") ``` **(3) 检查对称性容忍度** ```python mol.symmetry_tol = 1e-8 # 调高容忍度避免微小偏差 mol.build() ``` **(4) 手动验证轨道对称性** ```python from pyscf.symm import geom # 重建对称性对象 symm_obj = geom.symmetry(mol) print("Valid irreps:", symm_obj.irrep_name) # 确认系统识别的不可约表示 ``` #### 5. 示例调试流程 ```python # 完整调试示例 mol = gto.M(atom='H2O; H 0 1 0; O 0 0 0; H 0 0 1', symmetry=True) mol.build() mf = scf.RHF(mol).run() # 获取轨道对称性ID orb_sym = symm.label_orb_symm(mol, mol.irrep_id, mf.mo_coeff) irrep_symbols = symm.irrep_name(mol.groupname, orb_sym) # 打印前10个轨道的对称性 for i in range(10): print(f"Orbital {i}: ID={orb_sym[i]}, Symbol={irrep_symbols[i]}") ``` > **关键点**:轨道索引是程序内部排序结果,不可约表示ID需通过 `symm.irrep_name` 显式转换为符号。当两者"不匹配"时,通常因未正确转换ID或对称性检测偏差导致[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

大熊背

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值