opencv学习4——图像缩放
一、通過調(diào)用api實現(xiàn)尺寸的改變
cv2.resize(src,dsize,dst=None,fx=None,fy=None,interpolation=None) 圖像尺寸改變
scr:原圖片;dsize:輸出圖像尺寸;fx:沿水平軸的比例因子;fy:沿垂直軸的比例因子;interpolation:插值方法,包括:
cv2. INTER_LINEAR,雙線性插值(缺省);
cv2.INTER_NEAREST,最近鄰域插值;
cv2. INTER_CUBIC,4x4像素鄰域的雙三次插值;
cv2. INTER_LANCZOS4,8x8像素鄰域的Lanczos插值;
cv2. INTER_AREA, 像素關(guān)系重采樣
?
二、最近鄰域插值法
1.確定圖像縮放比例,將原圖像像素位置乘以縮放比例得到新圖像像位置,如果出現(xiàn)小數(shù),取最近鄰的像素位置(四舍五入)
2.numpy是科學(xué)計算中的常用庫,對于矩陣運算等十分方便
3.np.zeros(shape, dtype=float, order='C') 生成全零數(shù)組
Shape,數(shù)組尺寸,在此程序中設(shè)置為圖像的高、寬、通道三維數(shù)組
Dtype,數(shù)組元素類型,此代碼中這設(shè)置為無符號8位整數(shù)
Order,c代表與c語言類似,行優(yōu)先;F代表列優(yōu)先
?
三、雙線性插值法
1.給定任意一點,以及周圍已知四點(默認給定點不在已知圖像矩陣中)
2.通過兩次插值,通過周圍四點的值插值出給定點的值
3.第一次插值,確定A1、A2點的值,根據(jù)左上、左下點求出A1,根據(jù)兩點距離A1點的距離以及值進行按距離加權(quán)
P(A1) = D(A1~左上)*P(左上) + D(A1~左下)*P(左下)
同理得出A2的插值
P(A2) = D(A2~右上)*P(右上) + D(A2~右下)*P(右下)
4.第二次插值,對A1、A2進行插值得出指定點的插值
P(點) = D(A1~點)*P(A1) + D(A2~點)*P(A2)
?
四、代碼實現(xiàn)
1.api
# API 實現(xiàn)圖像尺寸改變import cv2img = cv2.imread('image01.jpg',1) imgHeight,imgWidth,imgMode = img.shape # 圖像長、寬、通道數(shù)值獲取# 壓縮比設(shè)置 coe1 = 0.5 coe2 = 2 dst1Height = int(imgHeight*coe1) dst1Width = int(imgWidth*coe1) dst2Height = int(imgHeight*coe2) dst2Width = int(imgWidth*coe2)dst1 = cv2.resize(img,(dst1Width,dst1Height)) dst2 = cv2.resize(img,(dst2Width,dst2Height)) cv2.imshow('image',dst1) cv2.imshow('image',dst2)cv2.waitKey(0) cv2.destroyAllWindows()2.最近鄰域插值法
# 最近鄰域插值法 # 實現(xiàn)過程: # 1.獲取原圖像信息,并設(shè)置縮放比 # 2.創(chuàng)建目標圖像尺寸的數(shù)組 # 3.確定像素對應(yīng)關(guān)系并賦值import cv2 import numpy as npimg = cv2.imread('image01.jpg',1) imgHeight,imgWidth,imgMode = img.shape coe = 0.5dstHeight = int(imgHeight*coe) dstWidth = int(imgWidth*coe) dstImg = np.zeros((dstHeight,dstWidth,imgMode),np.uint8)# 像素值確定,使用最近鄰域插值 for i in range(dstHeight):for j in range(dstWidth):y = int(i/coe + 0.5) #圖像改變后圖像中的位置 = 圖像改變前圖像中的位置 * 縮放比,改變前位置 = 改變后位置/縮放比以找到原像素值x = int(j/coe + 0.5) #原圖像A中的點a(x,y),對應(yīng)的,改變后圖像B中的點a'(x',y')=(x*coe,y*coe)dstImg[i,j] = img[y,x] #所以,x = x'/coe,得到對應(yīng)的原圖像中的位置,并將原像素中的值賦給改變后的像素cv2.imshow('image',dstImg)cv2.waitKey(0) cv2.destroyAllWindows()3.雙向線性插值法
#雙線性插值法import cv2 import numpy as npimg = cv2.imread('image01.jpg',1) imgHeight,imgWidth,imgMode = img.shape coe = 0.5dstHeight = int(imgHeight*coe) dstWidth = int(imgWidth*coe) dstImg = np.zeros((dstHeight,dstWidth,imgMode),np.uint8)# 像素值確定,使用雙線性插值 for i in range(dstHeight):for j in range(dstWidth):y = i / coe #確定所求點位置x = j / coedy1 = y - int(y) #確定A1、A2與四點的距離dy2 = int(y + 1) - ydx1 = x - int(x)dx2 = int(x + 1) - x#確定A1、A2插值A(chǔ)1 = dy1 * img[int(y), int(x)] + dy2 * img[int(y), int(x + 1)]A2 = dy1 * img[int(y + 1), int(x)] + dy2 * img[int(y + 1), int(x + 1)]dstImg[i, j] = dx1 * A1 + dx2 * A2cv2.imshow('image',dstImg)cv2.waitKey(0) cv2.destroyAllWindows()?
總結(jié)
以上是生活随笔為你收集整理的opencv学习4——图像缩放的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vue 手机端答题页面_从0开始,手把手
- 下一篇: 【Hadoop版】K-Shingle+最