精华内容
下载资源
问答
  • 本文共总结了OpenCV提供的4种resize图片的方法: 一、最近邻插值法 INTER_NEAREST 二、 一、最近邻插值法 INTER_NEAREST 1.简介 这是一种简单的插值算法:不需要计算,在待求象素的四邻象素中,将距离待求象素最近的...

    微信:18233275213

    本文共总结了OpenCV提供的4种resize图片的方法:
    一、最近邻插值法 INTER_NEAREST
    二、双线性插值(默认设置) INTER_LINEAR

    一、最近邻插值法 INTER_NEAREST

    1.简介

    这是一种简单的插值算法:不需要计算,在待求象素的四邻象素中,将距离待求象素最近的邻象素灰度赋给待求象素

    设i+u, j+v(i, j为正整数, u, v为大于零小于1的小数,下同)为待求象素坐标,则待求象素灰度的值 f(i+u, j+v)

    如下图所示:
    在这里插入图片描述
    如果(i+u, j+v)落在A区,即u<0.5, v<0.5,则将左上角象素的灰度值赋给待求象素,同理,落在B区则赋予右上角的象素灰度值,落在C区则赋予左下角象素的灰度值,落在D区则赋予右下角象素的灰度值。
    最邻近元法计算量较小,但可能会造成插值生成的图像灰度上的不连续,在灰度变化的地方可能出现明显的锯齿状。

    2.示例代码

    import cv2
    import numpy as np
    import os
    
    def over_length(path, save_path):
        for root, dir, files in os.walk(path):
            for file in files:
                # 读入原图片
                img = cv2.imdecode(np.fromfile(os.path.join(root, file), dtype=np.uint8), -1)
                print(img)
                # 将图片高和宽分别x赋值给x,y
                height, width = img.shape[0:2]
                # 显示原图
                cv2.imshow('OriginalPicture', img)
                # (width, int(height / 3)) 元组形式,高度缩放到原来的三分之一
                # img_change1 = cv2.resize(img, (int(width / 2), int(height / 2)))
                img_change1 = cv2.resize(img, (width, int(height / 2)), cv2.INTER_NEAREST)
                cv2.imencode('.jpg', img_change1)[1].tofile(save_path + file.split('.')[0]
                                                                      + '_' + 'overlength' + '.jpg')
    
    if __name__ == '__main__':
        over_length(r'..\历史记录\超长超短\超长\\',
                    r'..\历史记录\超长超短\结果\原图\\')
    

    3. 代码效果

    原图:
    在这里插入图片描述

    resize 后的图:
    在这里插入图片描述

    二、 双线性插值(默认设置) INTER_LINEAR

    1.简介

    OpenCV 默认的设置为 双线性插值
    双线性插值,就是两个方向的线性插值加起来。所以只要了解什么是线性插值,分别在x轴和y轴都做一遍,就是双线性插值了。

    线性插值的概念也非常简单,就是两个点A,B,要在AB中间插入一个点C(点C坐标在AB连线上),就直接让C的值落在AB的值的连线上就可以了。

    如A点坐标(0,0),值为3,B点坐标(0,2),值为5,那要对坐标为(0,1)的点C进行插值,就让C落在AB线上,值为4就可以了。

    但是如果C不在AB的线上呢? 所以就有了双线性插值。如图,已知Q12,Q22,Q11,Q21,但是要插值的点为P点,这就要用双线性插值了,首先在x轴方向上,对R1和R2两个点进行插值,即蓝色R1的值根据Q11和Q21的值可求得为:
    在这里插入图片描述
    蓝色R2的值为:
    在这里插入图片描述

    然后根据R1和R2在纵坐标y的方向上对P点进行插值,即
    在这里插入图片描述
    其中上面的f(Q11)、f(Q12)等这些可以理解为一个比例值,更靠近哪个点,在计算时这个点的比重就会大一些。
    这就是双线性插值。
    在这里插入图片描述

    2. 示例代码

    def over_length(path, save_path):
        for root, dir, files in os.walk(path):
            for file in files:
                # 读入原图片
                img = cv2.imdecode(np.fromfile(os.path.join(root, file), dtype=np.uint8), -1)
                print(img)
                # 将图片高和宽分别x赋值给x,y
                height, width = img.shape[0:2]
                # 显示原图
                cv2.imshow('OriginalPicture', img)
                # (width, int(height / 3)) 元组形式,高度缩放到原来的三分之一
                # img_change1 = cv2.resize(img, (width, int(height / 3)))
                img_change1 = cv2.resize(img, (int(width * 2), int(height * 2)), cv2.INTER_LINEAR)
                cv2.imencode('.jpg', img_change1)[1].tofile(save_path + file.split('.')[0]
                                                                      + '_' + 'overlength' + '.jpg')
    
    if __name__ == '__main__':
        over_length(r'D:\360MoveData\Users\Administrator\Desktop\wo\\',
                    r'D:\360MoveData\Users\Administrator\Desktop\wo\\')
         
    

    3. 代码效果

    原图:

    在这里插入图片描述
    resize后的图片:
    在这里插入图片描述
    个人已经进行了比较,将resize 2倍后的图片同原图片手动放大2倍,效果有一点点的区别,resize后的会差一点,基本上是看不出来的,效果是很不错的。 我是一个放大1000倍,一个放大 500倍 才看出来的一单差别。

    展开全文
  • 对于图片的resize,python中使用了PIL.Image中的resize((new_w,new_h), Image.BICUBIC),而Image.BICUBIC的插值方式可以使图像中边缘的变化更明显,对于边缘的检测效果才会达到要求。在尝试用opencv

    项目场景:

    最近在做一个纸页表格电子化处理的项目,需要在c++项目中调用darknet训练的识别模型。调用的方式采用了opencv的dnn模块,调用后,同样需要把phton代码转成c++来实现。

    问题描述:

    在复现代码的过程中,存在这样的问题: 对于图片的resize,python中使用了PIL.Image中的resize((new_w,new_h), Image.BICUBIC),而Image.BICUBIC的插值方式可以使图像中边缘的变化更明显,对于边缘的检测效果才会达到要求。在尝试用opencv中resize+CV_INTER_CUBIC发现,效果差距很大,无法替代PIL中的方法。

    原因分析:

    具体原因就不分析了,反正就是两个包中用的插值方法是不同的。

    解决方案:

    遇到了这个问题后,高手们肯定是直接去看pillow的源码,然后把源码中的功能实现出来就好了。 但作为一名老菜鸡,扣源码是不可能的(不会扣,也扣不动.....),于是本着进行最后挣扎的想法,对opencv中其他的插值方法依次进行了尝试, 最后发现CV_INTER_AREA和PIL中Image.BICUBIC的效果是最为接近的, 不用问我为什么,老菜鸡怎么可能知道这个。但是用CV_INTER_AREA替代后,至少可以基本实现这个目标。在此记录一下,希望可以帮助同样有此烦恼的兄弟们~
    展开全文
  • NEON优化——OpenCV Resize双线性插值

    千次阅读 2018-11-23 20:59:50
    具体原理可以自行搜索,这里只大致描述一下,目标图像上某一个点按比例映射到原始图像上某一点,不过通常计算得到的原始点坐标不是整数,最近邻的做法是向下取整,而双线性差值的做法是取与该坐标最接近的上下左右四...

    算法要点

    一、基本原理

    具体原理可以自行搜索,这里只大致描述一下,目标图像上某一个点按比例映射到原始图像上某一点,不过通常计算得到的原始点坐标不是整数,最近邻的做法是向下取整,而双线性差值的做法是取与该坐标最接近的上下左右四个点来线性加权,在放大的时候不会像最近邻那样锯齿严重,但是计算量会大不少。这里要注意的是加权分为两个维度,横向和纵向。此外,边界的处理也要注意。

    二、优化思路

    这里核心的优化思路有两点:

    1. 避免重复计算
    2. 浮点转定点

    避免重复计算

    首先要分析哪里存在可能的重复计算。resize是原始图像和目标图像之间的映射,这个映射不一定是一对一的。比如对于目标图像的高大于原始图像的高的情况,目标图像的多个行可能会映射到原始图像的同一行,这样我们就可以利用之前的计算结果,而不用重复计算。
    对于目标图像上的某个点,映射到原始图像的坐标为O,相邻的四个点为ABCD,则目标图像的像素值为val = A(1-fx)(1-fy) + Bfx(1-fy) + C(1-fx)fy + Dfxfy
    这个公式可以分解为两个过程:HResize和VResize

    HResize

    val0 = A(1-fx) + Bfx 
    val1 = C(1-fx) + Dfx
    

    VResize

    val = val0*(1-fy) + val1*fy
    

    之所以分解为两步,是因为上面提到的当目标图像的多行映射到原始图像的同一行时,HResize计算的结果是可以复用的,直接拷贝即可。而VResize是无法复用的,因为即便都映射到同一行,但是fy是不会相同的。

    浮点转定点

    浮点转定点需要乘一个转换系数。这里fx和fy都是浮点,OpenCV默认的做法是将fx和fy都乘以固定系数1<<11转成定点,最后结果再右移22。为什么取11,因为这是保证不溢出的最高的精度。分析上面的val0,假设A和B都取最大255,则val0最大为2^19。假设val0和val1都取最大值2^19,则val最大为2^30。如果这个固定系数取12,则val的最大值为2^32,即便是unsigned也装不下了。
    虽然取11能保证精度最大,但是由于val0最大是2^19,int16是装不下了,只能进行int32计算,neon一次只能算4个数。因此如果想提升neon向量化计算的并行度,可以给系数降低一点,参考OpenCV的三方库carotene,系数取的是7,同样这是为了保证能进行int16计算的最高精度,因为这样val0的最大值为2^15。此外为了保证VResize也能进行int16计算,val0和val1要转回到int8,这一点和OpenCV不一样。转换系数的降低可以提升向量化计算的并行度,进而提升性能,不过会对像素值造成一定的精度损失,经过测试,像素值的误差不会超过3,而转换系数为11时这个误差不会超过1。

    整个过程中计算量最重的部分是HResize,我们分析HResize的向量化过程,由于是int16的计算,因此一次最多算8个点,以8UC3为例,假设映射到原始图像的8个点分别为ABCDEFGH,

    A = A0 A1 A2 A3 A4 A5 A6 A7
    B = B0 B1 B2 B3 B4 B5 B6 B7
    C = C0 C1 C2 C3 C4 C5 C6 C7
    D = D0 D1 D2 D3 D4 D5 D6 D7
    E = E0 E1 E2 E3 E4 E5 E6 E7
    F = F0 F1 F2 F3 F4 F5 F6 F7
    G = G0 G1 G2 G3 G4 G5 G6 G7
    H = H0 H1 H2 H3 H4 H5 H6 H7
    

    对于A点,我们需要

    [A0 A1 A2]*K0 + [A3 A4 A5]*K0’,K0=1-fx,K0’=fx,

    后面的B~H点同理。

    因此向量化计算为

    [A0 B0 C0 D0 E0 F0 G0 H0]*[K0 K1 K2 K3 K4 K5 K6 K7] + [A3 B3 C3 D3 E3 F3 G3 H3]*[K0' K1' K2' K3' K4' K5' K6' K7']
    [A1 B1 C1 D1 E1 F1 G1 H1]*[K0 K1 K2 K3 K4 K5 K6 K6] + [A4 B4 C4 D4 E4 F4 G4 H4]*[K0' K1' K2' K3' K4' K5' K6' K7']
    [A2 B2 C2 D2 E2 F2 G2 H2]*[K0 K1 K2 K3 K4 K5 K6 K7] + [A5 B5 C5 D5 E5 F5 G5 H5]*[K0' K1' K2' K3' K4' K5' K6' K7']
    

    可见关键是要从ABCDEFGH向量中抽取出类似Ai Bi Ci Di Ei Fi Gi Hi(0<=i<6)这样的向量。

    这里已知两种做法,一种是转置,一种是查表。

    三、优化结果

    输出336x192,测试以下三种输入:

    phone224x128640x3601280x720
    MI60.61ms->0.16ms1.46ms->0.3ms1.78ms->0.35ms
    魅蓝5S1.97ms->0.57ms4.9ms->1.38ms5.64ms->1.97ms
    IPHONE70.31ms->0.06ms0.7ms->0.12ms0.8ms->0.17ms

    输出224x128,测试以下三种输入:

    phone336x192640x3601280x720
    MI60.52ms->0.12ms0.72ms->0.15ms0.73ms->0.17ms
    魅蓝5S1.67ms->0.45ms2.33ms->0.64ms2.59ms->1.25ms
    IPHONE70.27ms->0.05ms0.35ms->0.07ms0.36ms->0.07ms

    输出640x360,测试以下三种输入:

    phone224x128336x1921280x720
    MI61.51ms->0.36ms1.84ms->0.45ms1.91ms->1.21ms
    魅蓝5S4.87ms->1.44ms6.15ms->1.77ms6.32ms->4.88ms
    IPHONE70.44ms->0.15ms0.65ms->0.15ms0.38ms->0.37ms
    展开全文
  • 如下所示:def resize(src, dsize, dst=None, fx=None, fy=None, interpolation=None):如果使用vanilla resize,不改变默认参数,就会对原图像进行插值操作。不关你是扩大还是缩小图片,都会通过插值产生新的像素值...

    如下所示:

    def resize(src, dsize, dst=None, fx=None, fy=None, interpolation=None):

    如果使用vanilla resize,不改变默认参数,就会对原图像进行插值操作。不关你是扩大还是缩小图片,都会通过插值产生新的像素值。

    对于语义分割,target的处理,如果是对他进行resize操作的话。就希望不产生新的像素值,因为他的颜色信息,代表了像素的类别信息。

    但是我们有时候希望resize之后不产生新的像素值,而是产生利用最近邻点的像素值作为新产生的像素值。要实现这个操作只需要将interpolation=cv2.INTER_NEAREST,这个参数的默认值是双线性插值,几乎必然会产生新的像素值。

    补充知识:python+OpenCV最近邻域插值法 双线性插值法原理

    1.最近邻域插值法

    假设原图像大小为1022,缩放到510,可以用原图像上的点来表示目标图像上的每一个点。

    例如目标图像上的点(1,2)可以用原图像的点(2,4)来表示。

    dst x 1 -> dst x 2 newX

    newX = x*(src 行/目标 行) newX = 1*(10/5) = 2

    newY = y*(src列/目标 列) newY = 2*(20/10) = 4

    12.3取12,当为小数时则取离整数最近的数

    2.双线性插值法

    1-200F51K6053Q.jpg

    A1(15.2,22)

    A2(15.2,23)

    B1(15,22.3)

    B2(16,22.3)

    A1 = 20%上面的点 + 80%下面的点A2

    B1 = 30%左边的点 + 70%右面的点B2

    中间的点 = A130% + A270%

    中间的点 = B120% + B280%

    以上这篇python使用opencv resize图像不进行插值的操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。

    原文链接:https://blog.csdn.net/york1996/article/details/82856601

    展开全文
  • OpenCV.Resize详解

    万次阅读 2017-11-14 20:38:33
    详解opencv.resize函数,在各个图像处理项目里都应用十分广泛。最近一个小作业,整理图片大小不一样的数据集,就把它详细学习了一下。
  • OpenCVresize方法与双线性插值

    千次阅读 2018-02-08 16:54:50
    训练Object Detection...本文首先介绍了Caffe实现的SSD模型对输入图像的变换规定,引出了OpenCV中的resize方法,最后介绍该方法中的插值参数cv.INTER_LINEAR和该插值方法的原理。 caffe_ssd caffe_ssd在test阶...
  • 手撕OpenCV源码之resize_linear原理

    千次阅读 2018-04-09 20:47:56
    双线性插值 双线性插值,顾名思义就是在x方向和y方向上进行线性差值.如下图,在节点 A(x1,y1)和节点B(x2,y2)之间插入节点C(x,y).... ...x−x1x2−x1=y−y1y2−y1x−x1x2−x1=y−y1y2−y1\cfrac{x-x_1}{x_2-x_1} = ...
  • void cvResize( const CvArr* src, CvArr* dst, int interpolation=CV_INTER_LINEAR );src输入图像.dst输出图像.interpolation插值方法: CV_INTER_NN - 最近邻插值,CV_INTER_LINEAR - 双线性插值 (缺省使用)CV_...
  • 插值方式resize 函数的介绍各种插值方式INTER_NEAREST,最近邻插值法合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、...
  • OpenCV框架与图像差值算法1 主要内容1 插值算法2 算法理论介绍2.1 最近邻插值算法原理例子2.2 双线性插值2.3 映射方法2.3.1 向前映射法2.3.2 向后映射法3 代码实践 在python环境下配置: 安装CV:使用pip: pip ...
  • opencv改变图像大小cvResizeresize

    万次阅读 2019-09-11 13:41:28
    在实现图像窗口展示的时候,经常出现图像过大或过小而无法有效的展示全图,opencv提供了cvResize()和resize()两个函数进行相应的缩放操作 默认图片的坐标 1、cvResize:函数原形 CVAPI(void) cvResize( const ...
  • 最近邻插值和双线性插值的基本原理 图像的缩放很好理解,就是图像的放大和缩小。传统的绘画工具中,有一种叫做“放大尺”的绘画工具,画家常用它来放大图画。当然,在计算机上,我们不再需要用放大尺去放大或缩小图像...
  • 图像缩放--OpenCV cvResize函数

    千次阅读 2013-05-16 15:56:06
    void cvResize( const CvArr* src, CvArr* dst, int interpolation=CV_INTER_LINEAR ); src输入图像.dst输出图像.interpolation插值方法: CV_INTER_NN - 最近邻插值, CV_INTER_LINEAR - 双线性插值 (缺省使用...
  • opencv 分辨率与resize

    千次阅读 2017-08-01 18:52:42
    通过shape得到h,w, resize时先传入w。 h,w,depth=img.shape img=cv2.resize(img,(int(w/2),int(h/2)),interpolation=cv2.INTER_AREA)
  • 图像缩放--插值法(opencv,原理

    千次阅读 2017-06-20 15:35:56
    OpenCV代码:scale是放缩比例 点击( 此处 )折叠或打开 #include "stdafx.h" #include <</SPAN>cv . h > #include <</SPAN>cxcore . h > #include <</SPAN>highgui . h > ...
  • 通常情况下,我们在使用opencv时,假如要针对某一个具体的Mat对象的具体像素进行操作,通常会有这三种常见的方法:(1)、假如图像为img,通过img.at&lt;int&gt;(i,j)来进行访问(2)、通过指针的方法...
  • 然而,opencv提供的resize函数里有多种插值方式,最常见使用的是INTER_LINEAR(双线性插值)和INTER_NEAREST(最近邻插值)。在github上pytorch版本的yolov3的star数量最多的的是https://github.com/ultralytics/yol...
  • 手撕OpenCV源码之resize(INTER_AREA)

    万次阅读 2018-06-03 13:07:57
    手撕OpenCV源码之resize resize在modules/imgproc/src/文件件中,首先看resize API的函数实现: void resize(InputArray src, OutputArray dst, Size dsize, double fx=0, double fy=0, int interpolation=I...
  • 本文为转载文,原文链接:... 一、什么是resize 函数:  resize函数opencv中专门用来调整图像大小的函数;  opencv 提供五种方法供选择分别是:  a.最近邻插值——INTER_NEAREST;  ...
  • 在实现图像窗口展示的时候,经常出现图像过大或过小而无法有效的展示全图,opencv提供了cvResize()和resize()两个函数进行相应的缩放操作。 默认图片的坐标 1、cvResize:函数原形 CVAPI(void) cvResize( const...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,037
精华内容 1,614
关键字:

opencvresize原理