67、扩展程序13.5中用于对彩色图像进行去饱和处理的ImageJ插件,使得仅对用户选择的感兴趣区域(ROI)内的图像进行修改。
一般来说,要实现此功能,需要在插件代码中获取用户选择的ROI,然后只针对该区域内的像素执行去饱和操作。在ImageJ中,可以使用 Roi 类来处理ROI,在 run 方法中添加逻辑判断像素是否在ROI内,若在则进行去饱和处理。
68、编写一个 ImageJ 插件,对 RGB 图像进行选择性去饱和处理,保留与给定参考颜色 cref = (Rref, Gref, Bref) 相近色调的颜色,该参考颜色的 (HSV) 色调为 Href 。将图像转换为 HSV 格式,并按照公式 Hdesat Sdesat Vdesat = H f(H)·S V 修改颜色,其中 f(H) 是一个平滑的饱和度函数,例如形式为 f(H) = e− (H−Href )2 2·σ2 = gσ(H−Href) 的高斯函数,其中心为 Href,方差为 σ2 。要注意 H 分量在 [0, 1) 内是循环的。为获得连续且周期性的饱和度函数,注意到 H′ = H−Href 的范围是 [−1, 1],并将 f(H) 重新表述为 f(H) = gσ(H′+1) 当 H′ < −0.5 时, gσ(H′) 当 −0.5 ≤H′ ≤0.5 时, gσ(H′−1) 当 H′ > 0.5 时。验证函数 f(H) 的值,特别检查参考颜色对应的函数值是否为 1!什么样的(合成)彩色图像适合用于验证饱和度函数?使用 ImageJ 的颜色选择器(吸管)工具交互式指定参考颜色。
插件编写步骤
可按以下步骤编写插件:
- 将 RGB 图像转换为 HSV 颜色空间;
- 实现高斯饱和度函数 $ f(H) $,并根据 $ H’ $ 的范围使用不同公式计算;
- 遍历图像像素,根据公式修改 HSV 颜色分量;
- 将修改后的 HSV 颜色转换回 RGB 颜色;
- 使用 ImageJ 的颜色选择器工具获取参考颜色。
验证函数值
对于验证函数值,可将参考颜色代入函数计算。
合成彩色图像建议
适合验证饱和度函数的合成彩色图像可以是包含多种颜色且颜色分布均匀的图像,如:
- 彩色棋盘格
- 彩虹色带等
69、计算对于采用系数 wR = 0.2126、wB = 0.0722 和 wG = 0.7152 的 ITU - BT.709(高清电视)标准,从(线性)RGB 颜色转换为 YCbCr 的完整转换矩阵。
需依据给定系数,按照 YCbCr 与 RGB 转换公式进行计算得出完整转换矩阵。
70、编写一个程序(插件),在HSV空间中生成具有恒定色调和饱和度但不同亮度(值)的颜色序列。将这些颜色转换为RGB并绘制到新图像中。通过视觉验证色调是否真的保持恒定。
步骤如下:
- 设定恒定的色调(H)和饱和度(S)值。
- 生成一系列不同的亮度(V)值,例如从0到1以一定步长递增。
- 对每个V值,结合设定的H和S值,使用HSV → RGB转换方法将HSV颜色转换为RGB颜色。
- 创建一个新图像,将转换后的RGB颜色依次绘制到图像中。
- 最后通过视觉观察图像,验证色调是否保持恒定。
以下是一个简单的Python示例代码框架:
import cv2
import numpy as np
# 设定恒定的色调和饱和度
H = 0.5
S = 0.8
# 生成不同的亮度值
num_values = 10
values = np.linspace(0, 1, num_values)
# 创建一个新图像
height = 100
width = num_values * 100
image = np.zeros((height, width, 3), dtype=np.uint8)
# 遍历每个亮度值
for i, V in enumerate(values):
# 构建HSV颜色
hsv_color = np.array([H * 180, S * 255, V * 255], dtype=np.uint8).reshape(1, 1, 3)
# 转换为RGB
rgb_color = cv2.cvtColor(hsv_color, cv2.COLOR_HSV2RGB).reshape(3)
# 绘制到图像中
start_x = i * 100
end_x = (i + 1) * 100
image[:, start_x:end_x] = rgb_color
# 显示图像
cv2.imshow('Constant Hue and Saturation', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
71、简化3:3:2量化,使得每个颜色分量只执行一次位掩码/移位操作。
下面是给定的【文本内容】:
原代码中每个颜色分量已经基本是一次位掩码/移位操作,但如果要进一步简化组合步骤,可以将代码改写为:
1 ColorProcessor cp = (ColorProcessor) ip;
2 int C = cp.getPixel(u, v);
3 int R = (C & 0x00ff0000) >> 16 & 0xE0;
4 int G = (C & 0x0000ff00) >> 8 & 0xE0;
5 int B = (C & 0x000000ff) & 0xC0;
6 // 3:3:2 uniform color

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



