我有一个1920 x1080的输入图像,想分析对角线上的发光分布。我可以只使用中间一行,并根据需要“拉伸”它作为替代方案,但如果可能的话,我想坚持使用实际的对角线。
我目前的方法是通过基于毕达哥拉斯的对角线上的维度因子来计算像素,这会导致大约170个重复,我假设这是因为四舍五入。
有没有合适的方法来实现这一点?输入总是采用这种格式,但分辨率是可变的。
let num_rows = img.height();
let num_cols = img.width();
let diag_steps = ((num_cols.pow(2) + num_rows.pow(2)) as f32)
.sqrt()
.floor() as u32;
let col_factor = num_cols as f32 / diag_steps as f32;
let row_factor = num_rows as f32 / diag_steps as f32;
let mut diag_values = vec![];
for s in 0..diag_steps {
let r = ((s as f32 * row_factor).round() as u32).min(num_rows - 1);
let c = ((s as f32 * col_factor).round() as u32).min(num_cols - 1);
diag_values.push(c, r);
}
字符串
这种方法纯粹是基于我认为应该工作的,我使用图像crate来阅读/写图像。我在SO上找到了一个相关的问题,但答案对我没有帮助,我需要从右上角到左下角穿过中间的实际对角线,而不是设置Y = X的对角线。
我还对每个坐标周围的像素进行平均,以考虑噪声,但这对重复并不重要。
我试着像代码块中列出的那样对图像进行采样,并期望沿着图像的对角线沿着获得像素。我得到了预期的2202像素,但由于舍入,这些像素包含重复,我认为这可能会导致以后的进一步问题。
1条答案
按热度按时间xbp102n01#
你可以按长宽比步进,像这样:
字符串
这些是落在 * 精确 * 对角线上的 * 精确 * 像素。
这显然有使用整数表示宽高比的缺点。结果是1920 x1080的图像将具有16/9的宽高比。因为我们分别步进16和9个像素,所以我们跳过了一些像素。
此函数输出120像素的1920 x1080图像(gcf)。如果这是不希望的,您将需要处理子像素操作和混合数字计算(例如,什么是1.5像素?图像箱是否支持开箱即用?你会将浮点数舍入为整数而不关心均匀性吗?)然后,您可以在您的gcf点数之间外推点,或者计算您的长宽比作为浮动的比率并使用如上所示的斜率。