图像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 之间的区别,这些区别有时会影响到数据判断的正确性和安全性,给程序的测试运行造成很多麻烦.另外在面试题中也会遇到这些问题,如下: ...
随机推荐
- [HDU 5608]Function(莫比乌斯反演 + 杜教筛)
题目描述 有N2−3N+2=∑d∣Nf(d)N^2-3N+2=\sum_{d|N} f(d)N2−3N+2=∑d∣Nf(d) 求∑i=1Nf(i)\sum_{i=1}^{N} f(i)∑i=1Nf ...
- JSP中9大内置对象类型
JSP中九大内置对象为: request 请求对象 类型 javax.servlet.ServletRequest 作用域 Requ ...
- js中的数据类型以及转换
Js中的数据类型 Js中的数据类型一共有六种,即number,string,boolean,underfine,null,object. 一,number Number数据类型指的是数字,可以为整型, ...
- 009——Matlab调用cftool工具的函数方法
(一)参考文献:http://blog.sina.com.cn/s/blog_4a0a8b5d0100uare.html (二)视频教程:https://v.qq.com/x/page/x30392r ...
- ooo's vimrc
colorscheme evening set fillchars=vert:\ ,stl:\ ,stlnc:\ set nu set tabstop=4 set shiftwidth=4 set s ...
- ubuntu video and audio
推荐你直接安装ubuntu-studio系统.里面有默认安装了很多多媒体软件,主要集中在4个方面1.音频编辑:Jack, Ardour, Audacity, Qtractor. Hydrogen, Y ...
- Linux 系统配置IPv6
1.自动获取IPV6地址 1)修改/etc/sysconfig/network文件,修改如下字段,不存在则手动添加,部分系统默认是开启的NETWORKING_IPV6=yes 2)修改/etc/sys ...
- arcgis python 表属性转html
import arcpy import sys import string import os tablePath = arcpy.GetParameterAsText(0) filePath = a ...
- C++ 中virtual 用法
一.virtual 修饰基类中的函数,派生类重写该函数: #include using namespace std; class A{ public: virtual void display(){ ...
- Windows 下 把EXE 程序变成服务运行
1. 下载 instsrv.exe 和 srvany.exe 我下载的地址 [点击打开链接][https://www.cr173.com/soft/64394.html] 2. cmd cd ...