图像预处理中resize和padding

第一部分-Resize

如果只是为了获得要求尺寸的图像,最常用的方法就是resize, the usual practice is to resize the input image to the given size(但是resize有缺点,the image aspect ratio is no longer kept.)

This practice may work well for image classification where fine details may not be necessary. But for image retrieval, we want to keep the image aspect ratio unchanged.

而行人重识别又是图像检索的子任务。依据是以下的知乎链接:

浙江大学罗浩的知乎

上面加粗的文字引用自如下博客:

jdhao’s blog

所以,这就有新的概念要了解下了,image aspect ratio 图像宽高比 aspect ratio

引用自Yongqiang Cheng的CSDN博客

结合上述博客,简单地理解为一句话就是: 就是一个图像长边短边的比例。一般表示为:16:9,4:3,3:2, 21:9., 较少表示为小数的形式(decimal fraction)。但这些数字并不是实际的高度和宽度。另外的话,如果维度大于2,则可以称为超矩形(hyperrectangle). aspect ratio仍然可以定义为最长边和最短边的比。

在这里插入图片描述
原来的图像

在这里插入图片描述
resize为1024×1024的图像

可以发现的是,确实变形相当地严重。很显然不符合But for Image retrieval, we want to keep the image aspect ration unchanged这个要求了。

也不知道对于我的数据行不行,因为有如下的图像要求:

The person in the image should be roughly facing the camera(面向镜头), should be fully visible, and cover about 70-80% of the image height. Avoid heavy lens-distortion(镜头失真, 图像成什么样,是镜头失真了?), small focal-legths(较小的焦距啥样的是较小的焦距?), or uncommon viewing angles(不常见的视角, 什么样是不常见的视角,背对镜头怎么算?) for better performance(如果图像不符合它们这些要求,那么是不是表现也还行,只不过不是better performance?). If multiple people are visible(有别的人遮挡这个人的话), make sure the IUV detections(得在用densepose做IUV检测时候,只包含感兴趣的人)only contain the person of interest.

更多的例子:

1.含有多个人的情形:

在这里插入图片描述
原来的图像

在这里插入图片描述
resize为1024×1024的图像

2. 背对着镜头的情形:

在这里插入图片描述
原来的图像

在这里插入图片描述
resize为1024×1024的图像

第二部分-padding

考虑到直接resize的不足,所以我们考虑的是resize an image to square shape with padding and keep its aspect ratio. 其实最后图像还是被resize了,但是,用到的方式是padding.

正如

jdhao的博客所说,the main idea is to first resize the input image so that its maximum size equals to the given size(先resize一次,让起初的输入图像维度中最大那个尺寸和你想要的尺寸相等). Then we pad the resized image to make it square(然后才把得到的这个resized image再次pad成方形的.).

Python PIL实现

  • 先按照aspect ratio将107×318来resize成344×1024图像
  • 创建一个1024×1024的图像,然后把之前resized这个344×1024 paste上去 (下面有attach的图像)

在这里插入图片描述
原来的图像107*318

在这里插入图片描述
经过一步resize,resize为344×1024的图像

在这里插入图片描述
把resized的344×1024的图像paste到squared image上

然后接着利用ImageOps的expand()函数来add borders to the 4 side of an image.我们需要在应用这个方法前计算the padding length in 4 side of the resized image.

应该就是计算四个边中的每个边该padding多少?

OpenCV实现

==同样也是:要有resize和pad, 因为The full code to resize and pad an image is as follows: ==

也是得:is to first resize the input image so that its maximum size equals to the given size. Then we pad the resized image to make it square. 说白了就是:先保持aspect ratio情况下变到最大尺寸,然后再pad成方形的。
在这里插入图片描述
原来的图像107*318

在这里插入图片描述
经过一步resize,resize为344×1024的图像

感觉这是两个维度上都乘上了那个ratio, 而且最后保持了aspect ratio,没有变形产生.

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐