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.pswp.cn/news/389559.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/389559.shtml
英文地址,請注明出處:http://en.pswp.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:灰色和彩色圖像的像素直方圖及直方圖均值化的實現與展示

直方圖及直方圖均值化的理論,實現及展示 直方圖: 首先,我們來看看什么是直方圖: 理論概念: 在圖像處理中,經常用到直方圖,如顏色直方圖、灰度直方圖等。 圖像的灰度直方圖就描述了圖像中灰度分…

mysql.sock問題

Cant connect to local MySQL server through socket /tmp/mysql.sock 上述提示可能在啟動mysql時遇到,即在/tmp/mysql.sock位置找不到所需要的mysql.sock文件,主要是由于my.cnf文件里對mysql.sock的位置設定導致。 mysql.sock默認的是在/var/lib/mysql,…

交換機的基本原理配置(一)

1、配置主機名 在全局模式下輸入hostname 名字 然后回車即可立馬生效(在生產環境交換機必須有自己唯一的名字) Switch(config)#hostname jsh-sw1jsh-sw1(config)#2、顯示系統OS名稱及版本信息 特權模式下,輸入命令 show version Switch#show …

opencv:卷積涉及的基礎概念,Sobel邊緣檢測代碼實現及Same(相同)填充與Vaild(有效)填充

濾波 線性濾波可以說是圖像處理最基本的方法,它可以允許我們對圖像進行處理,產生很多不同的效果。 卷積 卷積的概念: 卷積的原理與濾波類似。但是卷積卻有著細小的差別。 卷積操作也是卷積核與圖像對應位置的乘積和。但是卷積操作在做乘…

機器學習股票_使用概率機器學習來改善您的股票交易

機器學習股票Note from Towards Data Science’s editors: While we allow independent authors to publish articles in accordance with our rules and guidelines, we do not endorse each author’s contribution. You should not rely on an author’s works without seek…

BZOJ 2818 Gcd

傳送門 題解&#xff1a;設p為素數 &#xff0c;則gcd(x/p,y/p)1也就是說求 x&#xff0f;p以及 y&#xff0f;p的歐拉函數。歐拉篩前綴和就可以解決 #include <iostream> #include <cstdio> #include <cmath> #include <algorithm> #include <map&…

LeetCode387-字符串中的第一個唯一字符(查找,自定義數據結構)

一開始想用HashMap&#xff0c;把每個字符放進去&#xff0c;然后統計出現的次數。 使用LinkedHashMap的話&#xff0c;鍵值對的順序都是不會變的。 LinkedHashMap<Character,Integer> map new LinkedHashMap<>();map.put(i,1111);map.put(j,2222);map.put(k,3333…

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的實現&#xff1a; 簡單來說&#xff0c;就是將數據從原始的空間中轉換到新的特征空間中&#xff0c;例如原始的空間是三維的(x,y,z)&#xff0c;x、y、z分別是原始空間的三個基&#xff0c;我們可以通過某種方法&#xff0c;用新的坐…

兩家大型網貸平臺竟在借款人審核問題上“偷懶”?

python信用評分卡&#xff08;附代碼&#xff0c;博主錄制&#xff09; https://study.163.com/course/introduction.htm?courseId1005214003&utm_campaigncommission&utm_sourcecp-400000000398149&utm_mediumshare 放貸流量增加&#xff0c;逾期率也會隨之增加&…

解決 Alfred 每次開機都提示請求通訊錄權限的問題

安裝完 Alfred 以后&#xff0c;每次開機都會提示請求通訊錄權限&#xff0c;把設置里的通訊錄關掉也沒用&#xff0c;每次都提示又非常煩人&#xff0c;這里把解決方法記錄一下。 依次打開 應用程序 - Alfred 3.app - 右鍵顯示包內容 - Contents - Frameworks - Alfred Framew…

【轉】DCOM遠程調用權限設置

原文&#xff1a;https://blog.csdn.net/ervinsas/article/details/36424127 最近幾天被搞得焦頭爛額&#xff0c;由于DCOM客戶端程序是在32位系統下開發的&#xff0c;調試時DCOM服務端也是安裝在同一臺機器上&#xff0c;所有過程一直還算順利。可這次項目實施的時候&#xf…

opencv:邊緣檢測之Laplacian算子思想及實現

Laplacian算子邊緣檢測的來源 在邊緣部分求取一階導數&#xff0c;你會看到極值的出現&#xff1a; 如果在邊緣部分求二階導數會出現什么情況? 從上例中我們可以推論檢測邊緣可以通過定位梯度值大于鄰域的相素的方法找到(或者推廣到大 于一個閥值). 從以上分析中&#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 導出插件

轉發&#xff1a;https://blog.csdn.net/gu_wen_jie/article/details/79296470 版本&#xff1a;laravel5 php 5.6 安裝步驟&#xff1a; 一、安裝插件 ①、首先在Laravel項目根目錄下使用Composer安裝依賴&#xff1a; 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接口、區塊鏈接口進行壓力測試的一些說明&#xff0c;為以后類似接口的測試提供參考。 環境部署 1、 下載Jmeter工具apache-jmeter-3.3.zip&am…

opencv:Canny邊緣檢測算法思想及實現

Canny邊緣檢測算法背景 求邊緣幅度的算法&#xff1a; 一階導數&#xff1a;sobel、Roberts、prewitt等算子 二階導數&#xff1a;Laplacian、Canny算子 Canny算子效果比其他的都要好&#xff0c;但是實現起來有點麻煩 Canny邊緣檢測算法的優勢&#xff1a; Canny是目前最優…