您好,登錄后才能下訂單哦!
在深度學(xué)習(xí)中,模型的輸入size通常是正方形尺寸的,比如300 x 300這樣.直接resize的話,會(huì)把圖像拉的變形.通常我們希望resize以后仍然保持圖片的寬高比.
例如:
如果直接resize到的話:
而我們希望得到:
可以利用copyMakeBorder和resize配合達(dá)到我們的目的.
import cv2 def resize_keep_aspectratio(image_src,dst_size): src_h,src_w = image_src.shape[:2] print(src_h,src_w) dst_h,dst_w = dst_size #判斷應(yīng)該按哪個(gè)邊做等比縮放 h = dst_w * (float(src_h)/src_w)#按照w做等比縮放 w = dst_h * (float(src_w)/src_h)#按照h做等比縮放 h = int(h) w = int(w) if h <= dst_h: image_dst = cv2.resize(image_src,(dst_w,int(h))) else: image_dst = cv2.resize(image_src,(int(w),dst_h)) h_,w_ = image_dst.shape[:2] print(h_,w_) top = int((dst_h - h_) / 2); down = int((dst_h - h_+1) / 2); left = int((dst_w - w_) / 2); right = int((dst_w - w_+1) / 2); value = [0,0,0] borderType = cv2.BORDER_CONSTANT print(top, down, left, right) image_dst = cv2.copyMakeBorder(image_dst, top, down, left, right, borderType, None, value) return image_dst image_src = cv2.imread("/home/sc/disk/data/bdd-data/bdd_data/bdd100k/images/10k/train/0a0a0b1a-7c39d841.jpg") dst_size = (720,720) image = resize_keep_aspectratio(image_src,dst_size) cv2.imshow("aaa",image) print(image.shape) if 27 == cv2.waitKey(): cv2.destroyAllWindows()
首先判斷應(yīng)該用w,h哪個(gè)方向的長(zhǎng)度做等比縮放,縮放到合適的尺寸后,在用copyMakeBorder對(duì)剩余像素進(jìn)行填充.深度學(xué)習(xí)中通常用灰度值128進(jìn)行邊界的填充.以文章開(kāi)頭的圖片為例,處理后得到的圖片:
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持億速云。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。