图像Resize中0.5像素中心对齐的问题
0.5像素对齐的问题
1. 问题提出
在进行图像缩放时,偶尔会看到一些比较奇怪的代码,其中有一个就是0.5像素中心对齐的问题,例如在OpenCV线性插值的代码中有类似如下操作(非源码,只是举例):
// 实际代码
int x=(i+0.5)*m/a-0.5;
int y=(j+0.5)*n/b-0.5;
// 公式计算
int x=i*m/a
int y=j*n/b
2. 原因分析
为什么要先加0.5又减去0.5呢?之前一直认为只是简单的取整操作,后来多次遇到,于是深入分析了一下,才发现原因:
在进行双线性插值的时候,通常情况下图像的原点都选在了左上角,即左上角像素的左上角,但实际访问的时候,\((0,0)\)却代表了第一个像素的值。那么对像素访问的可以按照如下方式来理解。当访问像素\((i,j)\)的时候,实际上获取的是以\((i,j)\)为左上角坐标原点的一个像素的值,即实际取值点与对应坐标点有一定偏差。平常使用的时候没问题,但是当进行图像缩放的时候,便会出现一些差异,例如:
把一个\(5\times 5\)图像缩放到\(3\times3\)大小,那么我们看像素对应关系,只看第一行:
\(I_(x,y)\)
\\I_{3\times3}(2,0) = I_{5\times5} (\frac{10}{3},0)
\]
由于\(I_{3\times3} ,I_{5\times5}\)的一个像素的大小是相同的,坐标表示的像素左上角的起始位置,那么可以得到如下示意图:

可以看到,按照这种情况,两张图并不是中心对齐的,实际会片左上角。那么如何解决这个问题呢:
\]
即在计算缩放坐标前先加上\((0.5,0.5)\)取中心点坐标,再乘以变换系数,然后再变换回左上角坐标,即减去\((0.5,0.5)\).
\]

其基本原理就是先获取像素中心的坐标,再对该坐标进行缩放,之后再获取变换后像素左上角位置坐标。
3. Ref
图像Resize中0.5像素中心对齐的问题的更多相关文章
- tf.image.resize_bilinear 图像缩放,双线性插值-图像中心对齐
http://www.cnblogs.com/yssongest/p/5303151.html 双线性插值算法及需要注意事项 input = tf.placeholder(tf.float32, sh ...
- OpenCV(3)-图像resize
在图像处理过程中,有时需要把图像调整到同样大小,便于处理,这时需要用到图像resize() 原函数 void resize(InputArray src, OutputArray dst, Size ...
- GDAL读取的坐标起点在像素左上角还是像素中心?
目录 1. 问题 2. 结论 3. 例外 1. 问题 笔者在处理地理栅格数据的时候,总是会发生偏差半个像素的问题. 比如说通过ArcMap打开一张.tif,查看其地理信息:同时用记事本打开.tfw,比 ...
- 图像Resize方式对深度学习模型效果的影响
在基于卷积神经网络的应用过程中,图像Resize是必不可少的一个步骤.通常原始图像尺寸比较大,比如常见监控摄像机出来的是1080P高清或者720P准高清画面,而网络模型输入一般没有这么大,像Yolo系 ...
- 与众不同 windows phone (40) - 8.0 媒体: 音乐中心的新增功能, 图片中心的新增功能, 后台音乐播放的新增功能
[源码下载] 与众不同 windows phone (40) - 8.0 媒体: 音乐中心的新增功能, 图片中心的新增功能, 后台音乐播放的新增功能 作者:webabcd 介绍与众不同 windows ...
- 【IE6的疯狂之六】li在IE中底部3像素的BUG(增加浮动解决问题)
今天开发项目中碰到一个li在IE中的BUG,先来看设计原型(如图:) 两个红色中间是<li>1px的底边框: 我写的代码如下: ============================== ...
- [FMX]在 FMX 程序中绘制单像素宽度的直线 [FMX]在 FMX 程序中绘制单像素宽度的直线
[FMX]在 FMX 程序中绘制单像素宽度的直线 2017-10-09 • Android.Delphi.教程 • 暂无评论 • swish •浏览 353 次 在前面的一篇文章中,我介绍了一种绘制低 ...
- php中0," ",null和false的区别
php中很多还不懂php中0,"",null和false之间的区别,这些区别有时会影响到数据判断的正确性和安全性,给程序的测试运行造成很多麻烦.先看一个例子: <? $str ...
- PHP中0、空、null和false的总结
php中很多人还不懂php中 0 , '' , null 和 false 之间的区别,这些区别有时会影响到数据判断的正确性和安全性,给程序的测试运行造成很多麻烦.另外在面试题中也会遇到这些问题,如下: ...
随机推荐
- linux mint 19.1安装搜狗输入法
1.到搜狗拼音输入法官网下载Linux版. 2.使用dpkg命令安装deb软件包: $ sudo dpkg -i sogoupinyin_2.2.0.0108_amd64.deb 3.安装成功;也有可 ...
- log4j2配置文件log4j2.xml详解
配置全解 1.缺省默认配置文件 <?xml version="1.0" encoding="UTF-8"?> <Configuration s ...
- MyBatis中jdbcType=INTEGER、VARCHAR作用
Mapper.xml中 pid = #{pid,jdbcType=INTEGER} pid = #{pid} 都可以用 Mybatis中什么时候应该声明jdbcType? 当Mybatis不能自动识别 ...
- bzoj 4319: cerc2008 Suffix reconstruction 贪心
如果字符集无限大的话直接按照 $sa$ 的顺序依次填即可. 由于字符集非常小,所以要尽量填相同的字符. 我们知道 $sa$ 数组,也就知道了 $rank$ 数组. 那么考虑添加排名为 $i$ 的字符: ...
- MySQL 语句整理 2019-5-3
MySQL 语句整理 在整理完Oracle的一些常见用语句后,由于MySQL的语法跟Oracle略有不同,随跟PN的MySQL视频进行了间接整理. 查询薪水大于1800, 并且部门编号为20或30的员 ...
- 02_Kibana的安装
Kibana部署 1. 下载Kibana $ wget https://artifacts.elastic.co/downloads/kibana/kibana-6.6.0-linux-x86_64. ...
- avalon.js中使用owl-carousel轮播图
<?php if($banners){?> <div class="ms-controller" ms-controller="bannerShow ...
- 隐藏tr
<tr id="yinchang" style="display: none"></tr> $("#yinchang& ...
- FLUENT导入CHEMKIN机理的单位问题【转载】
转载自:http://blog.sina.com.cn/s/blog_4a0a8b5d0101pj3c.html CHEMKIN机理导入后,发现速率常数全变了,那么他们是怎样变化的呢? FLUENT中 ...
- ICEM-圆锥的一种画法(2D转3D)
原视频下载地址:https://pan.baidu.com/s/1jIOEelo 密码: btap