管理員怎么看網(wǎng)站在線留言越秀seo搜索引擎優(yōu)化
實(shí)驗(yàn)2?幾何變換與變形
實(shí)驗(yàn)2-1:圖像縮放
實(shí)驗(yàn)要求:1)實(shí)現(xiàn)一個(gè)圖像縮放函數(shù),可以對輸入圖像進(jìn)行任意倍數(shù)的縮放;
2)采用雙線性插值進(jìn)行重采樣;
3)X,Y方向的縮放倍數(shù)參函數(shù)參數(shù)的形式傳入;
4)可以只考慮輸入圖像為3通道,8位深度的情況;
5)不能調(diào)用圖像處理庫的縮放函數(shù)來完成;
參考函數(shù):void Scale(const MyImage &input, MyImage &output, double sx, double sy);
對于實(shí)驗(yàn)一,先利用縮放倍數(shù),求得縮放后圖像的width和height。然后對縮放后圖像中的每個(gè)像素點(diǎn)(x,y),利用如下公式:
x'=x/sx? y'=y/sy (其中sx和sy分別為x和y軸上圖像的縮放倍數(shù))求得對應(yīng)于縮放前圖像中的(x',y'),滿足f(x,y)=f(x',y')
由于x'和y'不一定為整數(shù)值,因而需要用雙線性插值法求得f(x',y')
具體公式如下圖
此外,對于縮放圖像的左部和上部,會(huì)出現(xiàn)溢出問題,因此需要進(jìn)行邊界處理。
(而右下部不會(huì)出現(xiàn)該問題)
具體代碼實(shí)現(xiàn)如下
#圖像縮放
#input_img為輸入圖像,output_img為輸出圖像,x,y為縮放倍數(shù)
import math
import numpy as np
import cv2input_img = cv2.imread('img.png')
cv2.namedWindow("input Image", cv2.WINDOW_AUTOSIZE)
cv2.imshow('input Image',input_img)
# 等待按鍵用來展示圖片
# 釋放窗口x = 0.5
y = 1
width,height,dimension=input_img.shape #原圖像的行和列數(shù)和維度
new_width=round(width*x) #縮放后圖像的行數(shù),取整
new_height=round(height*y)
output_img=np.zeros((new_width,new_height,dimension),dtype=np.uint8)#定義矩陣
for i in range(new_width) :for j in range(new_height):tempx=math.floor(i/x) #(i,j)還原為原圖像的坐標(biāo)值的整數(shù)部分tempy=math.floor(j/y)if tempx == 0 or tempy == 0 or tempx == width-1 or tempy == height-1:output_img[0,j,:] = input_img[0,tempy,:] #處理縮放后圖像在上和左可能出現(xiàn)邊界溢出問題output_img[i,0,:] = input_img[tempx,0,:] #右下邊界不會(huì)出現(xiàn)溢出問題#對其余像素進(jìn)行處理else:# 計(jì)算原圖像坐標(biāo)減去新圖像坐標(biāo)的小數(shù)部分a = i / x - tempxb = j / y - tempyoutput_img[i,j,:]=input_img[tempx,tempy,:]*(1-a)*(1-b) + (1-a)*b*input_img[tempx,tempy+1,:] + a*(1-b)*input_img[tempx+1,tempy,:] + a*b*input_img[tempx+1,tempy+1,:]cv2.imshow("Scaled Image", output_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
運(yùn)行結(jié)果:
實(shí)驗(yàn)2-2:圖像變形
實(shí)驗(yàn)2-2根據(jù)實(shí)驗(yàn)提供的公式,逐步求出所需變量即可。
具體代碼實(shí)現(xiàn)如下
#圖像變形
import math
import numpy as np
import cv2input_img = cv2.imread('god.png')
cv2.namedWindow("input Image", cv2.WINDOW_AUTOSIZE)
cv2.imshow('input Image',input_img)width,height,dimension=input_img.shape #原圖像的行和列數(shù)和維度
output_img=np.zeros((width,height,dimension),dtype=np.uint8)#定義矩陣
for i in range(width):for j in range(height):#中心歸一化tempx=(i-0.5*width)/(0.5*width)tempy=(j-0.5*height)/(0.5*height)#計(jì)算r和θr=math.sqrt(math.pow(tempx,2)+math.pow(tempy,2))xita=math.pow((1-r),2)if r>=1:x=tempxy=tempyelse:x=math.cos(xita)*tempx-math.sin(xita)*tempyy=math.sin(xita)*tempx+math.cos(xita)*tempy#上述x和y是中心歸一化之后的坐標(biāo)值,根據(jù)公式反推圖像的x和y值#必須使用(uint16()函數(shù)進(jìn)行處理坐標(biāo),將其轉(zhuǎn)化成無符號(hào)16位的int類型,否則坐標(biāo)索引會(huì)出錯(cuò)#uint8保存的數(shù)據(jù),是0-255. uint16 保存的數(shù)據(jù),是0-65535.old_x=int((x + 1)*0.5*width)old_y=int((y + 1)*0.5*height)output_img[i,j,:]=input_img[old_x,old_y,:]
cv2.imshow("Reshaped Image", output_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
運(yùn)行結(jié)果:
??????????