opencv:用最邻近插值和双线性插值法实现上采样(放大图像)与下采样(缩小图像)

上采样与下采样

概念:

上采样:
放大图像(或称为上采样(upsampling)或图像插值(interpolating))的主要目的 是放大原图像,从而可以显示在更高分辨率的显示设备上。
下采样:
缩小图像(或称为下采样(subsampled)或降采样(downsampled))的主要目的 有两个:
1、使得图像符合显示区域的大小;2、生成对应图像的缩略图。
实现方法:
上采样原理:内插值
下采样原理:(M/s) * (N/s)(同比例缩小)

插值方法:

一:最邻近插值The nearest interpolation

设i+u, j+v(i, j为正整数, u, v为大于零小于1的小数,下同)为待求象素坐标,则待求象素灰 度的值 f(i+u, j+v) 如下图所示:
在这里插入图片描述

若我们在A区域插入像素,该像素值与(i,j)的值相同,同理若是在B区域插入像素,这该像素值与(i+1,j)的值相同。

缺点:
如果在A区域插入过多的像素,可能造成图像锯齿状。(导致在某一区域的像素值相同,导致失真)

代码实现:

import cv2
import numpy as np
def function(img):height,width,channels =img.shapeemptyImage=np.zeros((800,800,channels),np.uint8)	#建立一个空图像sh=800/heightsw=800/widthfor i in range(800):for j in range(800):x=int(i/sh)y=int(j/sw)emptyImage[i,j]=img[x,y]return emptyImageimg=cv2.imread("lenna.png")
print(img.shape)
zoom=function(img)
print(zoom.shape)
cv2.imshow("nearest interp",zoom)
cv2.imshow("image",img)
cv2.waitKey(0)

输出结果:
在这里插入图片描述
原图像为512×512,输出图像为800×800

二:双线性插值

公式:
f(i+u, j+v) = (1-u) * (1-v) * f(i, j) + (1-u) * v * f(i, j+1) + u * (1-v) * f(i+1, j) + u * v * f(i+1, j+1)
在这里插入图片描述

看着有点懵?
我们可以先看看单线性插值
在这里插入图片描述

公式:
在这里插入图片描述
其实就是一个比例关系:我们想要输入的值是y(像素值),已知的位置点是x(位置)。y和y0的距离差与x和x0的距离差的比值应等于y1和y0的距离差与x1与x0的距离差的比值。从而推导出在单线性的情况下,y的推导公式:
在这里插入图片描述
了解了单线性插值,我们推导双线性插值
在这里插入图片描述

在这里插入图片描述
先从x方向做两次单线性插值,得R1和R2,然后再在y方向做单线性插值:
因为在图像计算中,x1和x2,y1和y2都是相邻的点,导致x2-x1=1,y2-y1=1
最后得到的结果其实就是:
f(i+u, j+v) = (1-u) * (1-v) * f(i, j) + (1-u) * v * f(i, j+1) + u * (1-v) * f(i+1, j) + u * v * f(i+1, j+1)
注意:插值算法并不是只能用在放大,在插入像素点的同时,忽略原图周围点即为缩小。

双线性插值有个额外的步骤:中心对齐(能够对双向插值的图像精度的提升)
在这里插入图片描述
注意:在默认的双线性插值时,始终以左上角像素点进行对齐,这就导致最右边的点始终没有参与插值。可能造成精度损失。

应用中心对齐后的双线性插值的代码实现:

import numpy as np
import cv2'''
实现双线性插值
''' 
def bilinear_interpolation(img,out_dim):src_h, src_w, channel = img.shapedst_h, dst_w = out_dim[1], out_dim[0]print ("src_h, src_w = ", src_h, src_w)print ("dst_h, dst_w = ", dst_h, dst_w)if src_h == dst_h and src_w == dst_w:return img.copy()#如果输入大小与原图大小相同,则返回原图dst_img = np.zeros((dst_h,dst_w,3),dtype=np.uint8)#建立一个预输出的全0图像scale_x, scale_y = float(src_w) / dst_w, float(src_h) / dst_hfor i in range(3):for dst_y in range(dst_h):for dst_x in range(dst_w):#使用几何中心对称#如果使用直接方式,src_x=dst_x*scale_x#scale是比例,通过同比例缩小/放大实现中心对齐src_x = (dst_x + 0.5) * scale_x - 0.5src_y = (dst_y + 0.5) * scale_y - 0.5#找到将用于计算插值的点的坐标src_x0 = int(np.floor(src_x))src_x1 = min(src_x0 + 1 ,src_w - 1)src_y0 = int(np.floor(src_y))src_y1 = min(src_y0 + 1, src_h - 1)# 计算插值temp0 = (src_x1 - src_x) * img[src_y0,src_x0,i] + (src_x - src_x0) * img[src_y0,src_x1,i]temp1 = (src_x1 - src_x) * img[src_y1,src_x0,i] + (src_x - src_x0) * img[src_y1,src_x1,i]dst_img[dst_y,dst_x,i] = int((src_y1 - src_y) * temp0 + (src_y - src_y0) * temp1)return dst_imgif __name__ == '__main__':img = cv2.imread('lenna.png')cv2.imshow('original picture',img)dst = bilinear_interpolation(img,(700,700)) #放大#dst = bilinear_interpolation(img,(200,200))    #缩小cv2.imshow('bilinear interp',dst)cv2.waitKey()

输出结果:

在这里插入图片描述

中心对齐代码解读:

src_x = (dst_x + 0.5) * scale_x - 0.5
src_y = (dst_y + 0.5) * scale_y - 0.5

在这里插入图片描述
以这个图为例,可以明显看出,中心点在(i+0.5,j+0.5),也就是说,先将原图的中心点找到,然后按照放大/缩小的倍数,最后还需要减去0.5的偏差值。
这里我参考了其他的博客:

将公式变形,srcX=dstX* (srcWidth/dstWidth)+0.5*(srcWidth/dstWidth-1)   相当于我们在原始的浮点坐标上加上了0.5*(srcWidth/dstWidth-1)这样一个控制因子,这项的符号可正可负,与srcWidth/dstWidth的比值也就是当前插值是扩大还是缩小图像有关,有什么作用呢?看一个例子:假设源图像是33,中心点坐标(1,1)目标图像是99,中心点坐标(4,4),我们在进行插值映射的时候,尽可能希望均匀的用到源图像的像素信息,最直观的就是(4,4)映射到(1,1)现在直接计算srcX=4*3/9=1.3333!=1,也就是我们在插值的时候所利用的像素集中在图像的右下方,而不是均匀分布整个图像。现在考虑中心点对齐,srcX=(4+0.5)*3/9-0.5=1,刚好满足我们的要求.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/389559.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CSS魔法堂:那个被我们忽略的outline

前言 在CSS魔法堂:改变单选框颜色就这么吹毛求疵!中我们要模拟原生单选框通过Tab键获得焦点的效果,这里涉及到一个常常被忽略的属性——outline,由于之前对其印象确实有些模糊,于是本文打算对其进行稍微深入的研究^_^ …

初创公司怎么做销售数据分析_初创公司与Faang公司的数据科学

初创公司怎么做销售数据分析介绍 (Introduction) In an increasingly technological world, data scientist and analyst roles have emerged, with responsibilities ranging from optimizing Yelp ratings to filtering Amazon recommendations and designing Facebook featu…

opencv:灰色和彩色图像的像素直方图及直方图均值化的实现与展示

直方图及直方图均值化的理论,实现及展示 直方图: 首先,我们来看看什么是直方图: 理论概念: 在图像处理中,经常用到直方图,如颜色直方图、灰度直方图等。 图像的灰度直方图就描述了图像中灰度分…

交换机的基本原理配置(一)

1、配置主机名 在全局模式下输入hostname 名字 然后回车即可立马生效(在生产环境交换机必须有自己唯一的名字) Switch(config)#hostname jsh-sw1jsh-sw1(config)#2、显示系统OS名称及版本信息 特权模式下,输入命令 show version Switch#show …

opencv:卷积涉及的基础概念,Sobel边缘检测代码实现及Same(相同)填充与Vaild(有效)填充

滤波 线性滤波可以说是图像处理最基本的方法,它可以允许我们对图像进行处理,产生很多不同的效果。 卷积 卷积的概念: 卷积的原理与滤波类似。但是卷积却有着细小的差别。 卷积操作也是卷积核与图像对应位置的乘积和。但是卷积操作在做乘…

r psm倾向性匹配_南瓜香料指标psm如何规划季节性广告

r psm倾向性匹配Retail managers have been facing an extraordinary time with the COVID-19 pandemic. But the typical plans to prepare for seasonal sales will be a new challenge. More seasonal products have been introduced over the years, making August the bes…

主成分分析:PCA的思想及鸢尾花实例实现

主成份分析算法PCA 非监督学习算法 PCA的实现: 简单来说,就是将数据从原始的空间中转换到新的特征空间中,例如原始的空间是三维的(x,y,z),x、y、z分别是原始空间的三个基,我们可以通过某种方法,用新的坐…

两家大型网贷平台竟在借款人审核问题上“偷懒”?

python信用评分卡(附代码,博主录制) https://study.163.com/course/introduction.htm?courseId1005214003&utm_campaigncommission&utm_sourcecp-400000000398149&utm_mediumshare 放贷流量增加,逾期率也会随之增加&…

opencv:边缘检测之Laplacian算子思想及实现

Laplacian算子边缘检测的来源 在边缘部分求取一阶导数,你会看到极值的出现: 如果在边缘部分求二阶导数会出现什么情况? 从上例中我们可以推论检测边缘可以通过定位梯度值大于邻域的相素的方法找到(或者推广到大 于一个阀值). 从以上分析中&#xff0c…

使用机器学习预测天气_如何使用机器学习预测着陆

使用机器学习预测天气Based on every NFL play from 2009–2017根据2009-2017年每场NFL比赛 Ah, yes. The times, they are changin’. The leaves are beginning to fall, the weather is slowly starting to cool down (unless you’re where I’m at in LA, where it’s on…

laravel 导出插件

转发:https://blog.csdn.net/gu_wen_jie/article/details/79296470 版本:laravel5 php 5.6 安装步骤: 一、安装插件 ①、首先在Laravel项目根目录下使用Composer安装依赖: composer require "maatwebsite/excel:~2.1.0"…

国外 广告牌_广告牌下一首流行歌曲的分析和预测,第1部分

国外 广告牌Using Spotify and Billboard’s data to understand what makes a song a hit.使用Spotify和Billboard的数据来了解歌曲的流行。 Thousands of songs are released every year around the world. Some are very successful in the music industry; others less so…

Jmeter测试普通java类说明

概述 Apache JMeter是Apache组织开发的基于Java的压力测试工具。本文档主要描述用Jmeter工具对基于Dubbo、Zookeeper框架的Cassandra接口、区块链接口进行压力测试的一些说明,为以后类似接口的测试提供参考。 环境部署 1、 下载Jmeter工具apache-jmeter-3.3.zip&am…

opencv:Canny边缘检测算法思想及实现

Canny边缘检测算法背景 求边缘幅度的算法: 一阶导数:sobel、Roberts、prewitt等算子 二阶导数:Laplacian、Canny算子 Canny算子效果比其他的都要好,但是实现起来有点麻烦 Canny边缘检测算法的优势: Canny是目前最优…

opencv:畸变矫正:透视变换算法的思想与实现

畸变矫正 注意:虽然能够成功矫正但是也会损失了部分图像! 透视变换(Perspective Transformation) 概念: 透视变换是将图片投影到一个新的视平面(Viewing Plane),也称作投影映射(Projective Mapping)。 我们常说的仿射变换是透视…

数据多重共线性_多重共线性对您的数据科学项目的影响比您所知道的要多

数据多重共线性Multicollinearity is likely far down on a mental list of things to check for, if it is on a list at all. This does, however, appear almost always in real-life datasets, and it’s important to be aware of how to address it.多重共线性可能根本不…

K-Means聚类算法思想及实现

K-Means聚类概念: K-Means聚类是最常用的聚类算法,最初起源于信号处理,其目标是将数据点划分为K个类簇, 找到每个簇的中心并使其度量最小化。 该算法的最大优点是简单、便于理解,运算速度较快,缺点是只能应…

(2.1)DDL增强功能-数据类型、同义词、分区表

1.数据类型 (1)常用数据类型  1.整数类型 int 存储范围是-2,147,483,648到2,147,483,647之间的整数,主键列常设置此类型。 (每个数值占用 4字节) smallint 存储范围是-32,768 到 32,767 之间的整数,用…

充分利用昂贵的分析

By Noor Malik努尔马利克(Noor Malik) Let’s say you write a query in Deephaven which performs a lengthy and expensive analysis, resulting in a live table. For example, in a previous project, I wrote a query which pulled data from an RSS feed to create a li…

层次聚类和密度聚类思想及实现

层次聚类 层次聚类的概念: 层次聚类是一种很直观的算法。顾名思义就是要一层一层地进行聚类。 层次法(Hierarchicalmethods)先计算样本之间的距离。每次将距离最近的点合并到同一个类。然后,再 计算类与类之间的距离&#xff0…