上采樣(放大圖像)和下采樣(縮小圖像)(最鄰近插值和雙線性插值的理解和實現)

上采樣和下采樣

什么是上采樣和下采樣?

? 縮小圖像(或稱為下采樣(subsampled)或降采樣(downsampled))的主要目的有
兩個:1、使得圖像符合顯示區域的大小;2、生成對應圖像的縮略圖。
? 放大圖像(或稱為上采樣(upsampling)或圖像插值(interpolating))的主要目的
是放大原圖像,從而可以顯示在更高分辨率的顯示設備上。
注意:
如果想放大一個圖片或者一個圖片,應該想到,當圖片放大或縮小的時候,會增加或者減少像素點。比如說原來200×200的圖片,要是想變成400×400的圖片,就要多出3倍的像素點需要添加。而如何添加這些像素點就是問題的核心

原理:

上采樣原理:內插值 (增加像素點)
下采樣原理:(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)的像素值相同。

算法實現:

import cv2
import numpy as np"""
最鄰近插值The nearest interpolation實現
"""def function(img,aim_height,aim_width):height,width,channels = img.shape   #獲得原圖像的長寬和維度empty_img = np.zeros((aim_height,aim_width,channels),np.uint8)  #新建全0圖像transform_h = aim_height/height #找到長的放大/縮小倍數transform_w = aim_width/width   #找到寬的放大/縮小倍數for i in range(aim_height):for j in range(aim_width):x = int(i/transform_h)  #找到最近鄰點(這個點必須取整)y = int(j/transform_w)empty_img[i,j]=img[x,y] #將最近鄰點的數值賦予新圖像return empty_imgimg = cv2.imread("lenna.png")
transform_picture = function(img,800,800)   #800,800是新圖像大小
cv2.imshow("transform picture",transform_picture)
cv2.waitKey(0)

實現結果:

在這里插入圖片描述

雙線性插值:

單線性插值:

要想知道什么是雙線性插值,我們先來研究單線性插值:
在這里插入圖片描述
如圖所示,我們想要求(x,y)的y坐標,現在已知:x,(x0,y0),(x1,y1),該怎么求?
通過等比例的方法:可以獲得如下推論
在這里插入圖片描述
最后的結果就是紅框部分公式

雙線性插值:

這時候我們再看雙線性插值:
在這里插入圖片描述
我們將其拆解為X方向和Y方向的單線性插值。
通過Q11和Q21能夠獲得R1的值,再通過Q12和Q22獲得R2的值,最后通過R1和R2推得P的值。
具體推理過程如下:
在這里插入圖片描述
由于圖像雙線性插值只會用相鄰的4個點,因此上述公式的分母都是1。

幾何中心對齊:

目前還存在有問題:
坐標系的選擇問題:在這里插入圖片描述
如果源圖像和目標圖像的原點(0,0)均選擇左上角,然后根據插值公式計算目標圖像每點像素,假設你需要將一幅5x5的圖像縮小成3x3,那么源圖像和目標圖像各個像素之間的對應關系如下:
在這里插入圖片描述
也就是說,圖像當以左上角為對齊點來看,會使偏右偏下的原像素點的價值變低,新插值點受偏左偏上的原像素點影響更大。
那么,讓坐標加1或者選擇右下角為原點怎么樣呢?很不幸,還是一樣的效果,不過這次得到的圖像將偏右偏下。
最好的方法就是,兩個圖像的幾何中心重合,并且目標圖像的每個像素之間都是等間隔的,并且都和兩邊有一定的邊距。
公式如下:
在這里插入圖片描述
這里老師進行了公式的推導:
在這里插入圖片描述

算法實現:

import cv2
import numpy as np"""
雙線性插值實現
"""def bilinear_interpolation(img,out_dim):input_h,input_w,channels = img.shapeout_h,out_w = out_dim[0],out_dim[1]if input_h == out_h and input_w == out_w:   #若輸出圖像和輸入圖像要求相等,則輸出原圖像return img.copy()empty_img = np.zeros((out_h,out_w,channels),np.uint8)scale_x, scale_y = float(out_h / input_h),float(out_w / input_w)for i in range(channels):for dst_y in range(out_h):for dst_x in range(out_w):#幾何中心對齊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, input_w - 1)src_y0 = int(np.floor(src_y))src_y1 = min(src_y0 + 1, input_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]empty_img[dst_y, dst_x, i] = int((src_y1 - src_y) * temp0 + (src_y - src_y0) * temp1)return empty_imgif __name__ == '__main__':img = cv2.imread('lenna.png')transform_picture = bilinear_interpolation(img,(800,800))cv2.imshow('transform picture',transform_picture)cv2.waitKey()

實現結果:

在這里插入圖片描述

最鄰近插值與雙線性插值的對比:

雙線性差值法的計算比最鄰近插值法復雜,計算量較大,但沒有灰度不連續的缺點,圖像看起來更光滑。
而最鄰近插值更快,更簡單。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/389394.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/389394.shtml
英文地址,請注明出處:http://en.pswp.cn/news/389394.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

r語言繪制雷達圖_用r繪制雷達蜘蛛圖

r語言繪制雷達圖I’ve tried several different types of NBA analytical articles within my readership who are a group of true fans of basketball. I found that the most popular articles are not those with state-of-the-art machine learning technologies, but tho…

java 分裂數字_分裂的補充:超越數字,打印物理可視化

java 分裂數字As noted in my earlier Nightingale writings, color harmony is the process of choosing colors on a Color Wheel that work well together in the composition of an image. Today, I will step further into color theory by discussing the Split Compleme…

Java 集合 之 Vector

http://www.verejava.com/?id17159974203844 import java.util.ArrayList; import java.util.Enumeration; import java.util.List; import java.util.Vector;public class Test {/*** param args the command line arguments*/public static void main(String[] args) {//打印…

前端電子書單大分享~~~

前言 純福利, 如果你不想買很多書,只想省錢看電子書; 如果你找不到很多想看書籍的電子書版本; 那么,請保存或者下載到自己的電腦或者手機或者網盤吧。 不要太著急,連接在最后呢 前端 前端框架 node html-cs…

結構化數據建模——titanic數據集的模型建立和訓練(Pytorch版)

本文參考《20天吃透Pytorch》來實現titanic數據集的模型建立和訓練 在書中理論的同時加入自己的理解。 一,準備數據 數據加載 titanic數據集的目標是根據乘客信息預測他們在Titanic號撞擊冰山沉沒后能否生存。 結構化數據一般會使用Pandas中的DataFrame進行預處理…

比賽,幸福度_幸福與生活滿意度

比賽,幸福度What is the purpose of life? Is that to be happy? Why people go through all the pain and hardship? Is it to achieve happiness in some way?人生的目的是什么? 那是幸福嗎? 人們為什么要經歷所有的痛苦和磨難? 是通過…

帶有postgres和jupyter筆記本的Titanic數據集

PostgreSQL is a powerful, open source object-relational database system with over 30 years of active development that has earned it a strong reputation for reliability, feature robustness, and performance.PostgreSQL是一個功能強大的開源對象關系數據庫系統&am…

Django學習--數據庫同步操作技巧

同步數據庫:使用上述兩條命令同步數據庫1.認識migrations目錄:migrations目錄作用:用來存放通過makemigrations命令生成的數據庫腳本,里面的生成的腳本不要輕易修改。要正常的使用數據庫同步的功能,app目錄下必須要有m…

《20天吃透Pytorch》Pytorch自動微分機制學習

自動微分機制 Pytorch一般通過反向傳播 backward 方法 實現這種求梯度計算。該方法求得的梯度將存在對應自變量張量的grad屬性下。 除此之外,也能夠調用torch.autograd.grad 函數來實現求梯度計算。 這就是Pytorch的自動微分機制。 一,利用backward方…

React 新 Context API 在前端狀態管理的實踐

2019獨角獸企業重金招聘Python工程師標準>>> 本文轉載至:今日頭條技術博客 眾所周知,React的單向數據流模式導致狀態只能一級一級的由父組件傳遞到子組件,在大中型應用中較為繁瑣不好管理,通常我們需要使用Redux來幫助…

機器學習模型 非線性模型_機器學習模型說明

機器學習模型 非線性模型A Case Study of Shap and pdp using Diabetes dataset使用糖尿病數據集對Shap和pdp進行案例研究 Explaining Machine Learning Models has always been a difficult concept to comprehend in which model results and performance stay black box (h…

5分鐘內完成胸部CT掃描機器學習

This post provides an overview of chest CT scan machine learning organized by clinical goal, data representation, task, and model.這篇文章按臨床目標,數據表示,任務和模型組織了胸部CT掃描機器學習的概述。 A chest CT scan is a grayscale 3…

Pytorch高階API示范——線性回歸模型

本文與《20天吃透Pytorch》有所不同,《20天吃透Pytorch》中是繼承之前的模型進行擬合,本文是單獨建立網絡進行擬合。 代碼實現: import torch import numpy as np import matplotlib.pyplot as plt import pandas as pd from torch import …

vue 上傳圖片限制大小和格式

<div class"upload-box clear"><span class"fl">上傳圖片</span><div class"artistDet-logo-box fl"><el-upload :action"this.baseServerUrl/fileUpload/uploadPic?filepathartwork" list-type"pic…

作業要求 20181023-3 每周例行報告

本周要求參見&#xff1a;https://edu.cnblogs.com/campus/nenu/2018fall/homework/2282 1、本周PSP 總計&#xff1a;927min 2、本周進度條 代碼行數 博文字數 用到的軟件工程知識點 217 757 PSP、版本控制 3、累積進度圖 &#xff08;1&#xff09;累積代碼折線圖 &…

算命數據_未來的數據科學家或算命精神向導

算命數據Real Estate Sale Prices, Regression, and Classification: Data Science is the Future of Fortune Telling房地產銷售價格&#xff0c;回歸和分類&#xff1a;數據科學是算命的未來 As we all know, I am unusually blessed with totally-real psychic abilities.眾…

openai-gpt_為什么到處都看到GPT-3?

openai-gptDisclaimer: My opinions are informed by my experience maintaining Cortex, an open source platform for machine learning engineering.免責聲明&#xff1a;我的看法是基于我維護 機器學習工程的開源平臺 Cortex的 經驗而 得出 的。 If you frequent any part…

Pytorch高階API示范——DNN二分類模型

代碼部分&#xff1a; import numpy as np import pandas as pd from matplotlib import pyplot as plt import torch from torch import nn import torch.nn.functional as F from torch.utils.data import Dataset,DataLoader,TensorDataset""" 準備數據 &qu…

OO期末總結

$0 寫在前面 善始善終&#xff0c;臨近期末&#xff0c;為一學期的收獲和努力畫一個圓滿的句號。 $1 測試與正確性論證的比較 $1-0 什么是測試&#xff1f; 測試是使用人工操作或者程序自動運行的方式來檢驗它是否滿足規定的需求或弄清預期結果與實際結果之間的差別的過程。 它…

puppet puppet模塊、file模塊

轉載&#xff1a;http://blog.51cto.com/ywzhou/1577356 作用&#xff1a;通過puppet模塊自動控制客戶端的puppet配置&#xff0c;當需要修改客戶端的puppet配置時不用在客戶端一一設置。 1、服務端配置puppet模塊 &#xff08;1&#xff09;模塊清單 [rootpuppet ~]# tree /et…