小編給大家分享一下怎么使用Python OpenCV為CNN增加圖像樣本,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
成都創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),徐匯企業(yè)網(wǎng)站建設(shè),徐匯品牌網(wǎng)站建設(shè),網(wǎng)站定制,徐匯網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷(xiāo),網(wǎng)絡(luò)優(yōu)化,徐匯網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力??沙浞譂M(mǎn)足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專(zhuān)業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶(hù)成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。python常用的庫(kù):1.requesuts;2.scrapy;3.pillow;4.twisted;5.numpy;6.matplotlib;7.pygama;8.ipyhton等。
我們?cè)谧錾疃葘W(xué)習(xí)的過(guò)程中,經(jīng)常面臨圖片樣本不足、不平衡的情況,在本文中,作者結(jié)合實(shí)際工作經(jīng)驗(yàn),通過(guò)圖像的移動(dòng)、縮放、旋轉(zhuǎn)、增加噪聲等圖像變換技術(shù),能快速、簡(jiǎn)便的增加樣本數(shù)量。
使用OpenCV跨平臺(tái)計(jì)算機(jī)視覺(jué)庫(kù),在Python3.6上實(shí)現(xiàn),。
1. 圖片拼接及平移
1.1. 圖像移動(dòng)
圖像平移是將圖像的所有像素坐標(biāo)進(jìn)行水平或垂直方向移動(dòng),也就是所有像素按照給定的偏移量在水平方向上沿x軸、垂直方向上沿y軸移動(dòng)。
#移動(dòng)圖像,讓出邊緣,大小不變(此方法比較笨了) def move_img(img_file1,out_file,tunnel,border_position,border_width): print('file1=' + img_file1 ) img1 = cv2.imread(img_file1, cv2.IMREAD_GRAYSCALE) hight,width = img1.shape # 初始化空?qǐng)D final_matrix = np.zeros((hight,width), np.uint8) #,tunnel), np.uint8) #高*款(y,x)20*20*1 # change x1=0 y1=hight x2=width y2=0 #圖片高度,坐標(biāo)起點(diǎn)從上到下 if border_position =='top': final_matrix[y2:y1 - border_width, x1:x2] = img1[y2 + border_width:y1, x1:x2] #左側(cè)增加邊或空白 if border_position == 'left': final_matrix[y2 :y1, x1:x2 - border_width] = img1[y2:y1, x1 + border_width:x2] if border_position == 'right': final_matrix[y2 :y1, x1 + border_width:x2] = img1[y2:y1, x1:x2 - border_width] #底部增加邊或空白 if border_position =='bottom': final_matrix[y2 + border_width :y1, x1:x2] = img1[y2:y1 - border_width , x1:x2] if border_position =='copy': final_matrix[y2 :y1, x1:x2] = img1[y2:y1 , x1:x2] cv2.imwrite(out_file, final_matrix) return final_matrix
樣例代碼,詳見(jiàn)第5章節(jié)。
1.2. 圖片拼接
圖片拼接是分別讀取圖片,新建一個(gè)目標(biāo)像素大小的0矩陣,最后將讀取的圖片替換新建矩陣中目標(biāo)位置上的元素即可。主要可用于圖像切換場(chǎng)景,例如常見(jiàn)的齒輪式數(shù)字儀表盤(pán),數(shù)字進(jìn)位時(shí)出現(xiàn)的半個(gè)數(shù)字。
#圖像四周拼接邊緣,大小不變 def splicing_img(img_file1,img_file2,out_file,tunnel,border_position,border_width): print('file1=' + img_file1 + ', file2=' + img_file2) img1 = cv2.imread(img_file1, cv2.IMREAD_GRAYSCALE) img2 = cv2.imread(img_file2, cv2.IMREAD_GRAYSCALE) #第二個(gè)參數(shù)為如何讀取圖片,包括cv2.IMREAD_COLOR:讀入一副彩色圖片;cv2.IMREAD_GRAYSCALE:以灰度模式讀入圖片;cv2.IMREAD_UNCHANGED:讀入一幅圖片,并包括其alpha通道。 hight,width = img1.shape final_matrix = np.zeros((hight,width), np.uint8) #,tunnel), np.uint8) #高*款(y,x)20*20*1 # change x1=0 y1=hight x2=width y2=0 #圖片高度,坐標(biāo)起點(diǎn)從上到下 if border_position =='top': final_matrix[y2 + border_width:y1, x1:x2] = img1[y2:y1 - border_width, x1:x2] final_matrix[y2:border_width, x1:x2] = img2[y2:border_width, x1:x2] #左側(cè)增加邊或空白 if border_position == 'left': final_matrix[y2 :y1, x1+ border_width:x2] = img1[y2:y1, x1:x2 - border_width] final_matrix[y2:y1, x1:border_width] = img2[y2:y1, x1:border_width] if border_position == 'right': final_matrix[y2 :y1, x1:x2 - border_width] = img1[y2:y1, x1 + border_width:x2] final_matrix[y2:y1, x2-border_width:x2] = img2[y2:y1, x1:border_width] #底部增加邊或空白 if border_position =='bottom': final_matrix[y2 :y1 - border_width, x1:x2] = img1[y2+ border_width:y1 , x1:x2] final_matrix[y1 - border_width:y1, x1:x2] = img2[y2:border_width, x1:x2] if border_position =='copy': final_matrix[y2 :y1, x1:x2] = img1[y2:y1 , x1:x2] cv2.imwrite(out_file, final_matrix) return final_matrix
2. 圖片仿射變換之平移、旋轉(zhuǎn)
2.1. 關(guān)于仿射變換
仿射變換,又稱(chēng)仿射映射,是指在幾何中,一個(gè)向量空間進(jìn)行一次線(xiàn)性變換并接上一個(gè)平移,變換為另一個(gè)向量空間。
仿射變換是在幾何上定義為兩個(gè)向量空間之間的一個(gè)仿射變換或者仿射映射(來(lái)自拉丁語(yǔ),affine,“和…相關(guān)”)由一個(gè)非奇異的線(xiàn)性變換(運(yùn)用一次函數(shù)進(jìn)行的變換)接上一個(gè)平移變換組成。仿射變換可以通過(guò)一系列的原子變換的復(fù)合來(lái)實(shí)現(xiàn),包括:平移(Translation)、縮放(Scale)、翻轉(zhuǎn)(Flip)、旋轉(zhuǎn)(Rotation)和剪切(Shear)。
2.2. Python上的OpenCV實(shí)現(xiàn) 2.2.1. 旋轉(zhuǎn)
旋轉(zhuǎn)是通過(guò)仿射變換實(shí)現(xiàn)的,首先,旋轉(zhuǎn)需要先定義一個(gè)旋轉(zhuǎn)矩陣,使用cv2.getRotationMatrix2D()函數(shù)。
參數(shù)1:需要旋轉(zhuǎn)的中心點(diǎn);
參數(shù)2:需要旋轉(zhuǎn)的角度;
參數(shù)3:需要縮放的比例。
#旋轉(zhuǎn)圖像,輸入文件名、輸出文件名,旋轉(zhuǎn)角度 def rotationImg(img_file1,out_file,ra): # 獲取圖片尺寸并計(jì)算圖片中心點(diǎn) img = cv2.imread(img_file1, cv2.IMREAD_GRAYSCALE) (h, w) = img.shape[:2] center = (w/2, h/2) M = cv2.getRotationMatrix2D(center, ra, 1.0) rotated = cv2.warpAffine(img, M, (w, h)) #cv2.imshow("rotated", rotated) #cv2.waitKey(0) cv2.imwrite(out_file, rotated) return rotated
2.2.2. 平移
使用仿射變換平移圖像,首先使用已經(jīng)給出的平移矩陣M:[[1,0,x],[0,1,y]],x、y分別是x與y在橫向、縱向移動(dòng)像數(shù)。
#仿射變換技術(shù),平移圖片,x_off:x方向平移像數(shù);y_off:y方向平移像數(shù),正數(shù)是右、下方移動(dòng),負(fù)數(shù)為左、上方移動(dòng) def translation_img(img_file1,out_file,x_off,y_off): img = cv2.imread(img_file1, cv2.IMREAD_GRAYSCALE) rows,cols = img.shape # 定義平移矩陣,需要是numpy的float32類(lèi)型 # x軸平移x_off,y軸平移y_off, 2*3矩陣 M = np.float32([[1,0,x_off],[0,1,y_off]]) dst = cv2.warpAffine(img,M,(cols,rows)) cv2.imwrite(out_file, dst)
3. 圖片縮放及剪裁
3.1. 圖片縮放
圖片縮放使用CV2的cv2.resize()函數(shù),函數(shù)語(yǔ)法如下:cv2.resize(img, (dstWeight,dstHeight)),第一個(gè)參數(shù)是源圖像數(shù)據(jù),第二個(gè)參數(shù)(目標(biāo)寬度,目標(biāo)高度)。
在實(shí)際應(yīng)用中,輸入圖像大小是固定不變,這樣在縮放圖片后,如果是放大,則需要剪裁,如果縮寫(xiě),則出現(xiàn)空余區(qū)域。(注:本案例中參數(shù)deviation,用于取放大圖像的起點(diǎn)位置,參照位置為左上角)
#縮放,輸入文件名,輸出文件名,放大高與寬,偏離度 def resizeImg(img_file1,out_file,dstWeight,dstHeight,deviation): img1 = cv2.imread(img_file1, cv2.IMREAD_GRAYSCALE) imgshape = img1.shape h = imgshape[0] w = imgshape[1] final_matrix = np.zeros((h,w), np.uint8) x1=0 y1=h x2=w y2=0 #圖片高度,坐標(biāo)起點(diǎn)從上到下 dst = cv2.resize(img1, (dstWeight,dstHeight)) if h<dstHeight: final_matrix[y2 :y1, x1:x2] = dst[y2+deviation:y1+deviation , x1+deviation:x2+deviation] else: if deviation == 0: final_matrix[y2 :dstHeight, x1:dstWeight] = dst[y2 :dstHeight,x1 :dstWeight] else: final_matrix[y2 + deviation:dstHeight + deviation, x1 + deviation:dstWeight + deviation] = dst[y2 :dstHeight,x1 :dstWeight] cv2.imwrite(out_file, final_matrix) return final_matrix
3.2. 圖片剪裁
在做圖像處理時(shí),一般是圖像大小保持一致,因此,圖片剪裁時(shí),圖片大小不變,去掉不需要的部分。
#剪切圖片 def cut_img(img_file1,out_file,top_off,left_off,right_off,bottom_off): img1 = cv2.imread(img_file1, cv2.IMREAD_GRAYSCALE) hight,width = img1.shape x1=0 y1=hight x2=width y2=0 #圖片高度,坐標(biāo)起點(diǎn)從上到下hight,width = img1.shape #灰度圖像,不使用通道tunnel final_matrix = np.zeros((hight,width), np.uint8) #,tunnel), np.uint8) #高*款(y,x)20*20*1 final_matrix[y2 + top_off:y1 - bottom_off, x1 + left_off:x2 - right_off] = img1[y2 + top_off:y1 - bottom_off, x1 + left_off:x2 - right_off] cv2.imwrite(out_file, final_matrix) return final_matrix
4. 圖片增加高斯噪聲/椒鹽噪聲
在matlab中,存在執(zhí)行直接得函數(shù)來(lái)添加高斯噪聲和椒鹽噪聲。Python-OpenCV中雖然不存在直接得函數(shù),但是很容易使用相關(guān)的函數(shù)來(lái)實(shí)現(xiàn)。
4.1. 添加鹽椒噪聲
# 添加椒鹽噪聲,prob:噪聲比例 def sp_noiseImg(img_file1,prob): image = cv2.imread(img_file1, cv2.IMREAD_GRAYSCALE) output = np.zeros(image.shape,np.uint8) thres = 1 - prob for i in range(image.shape[0]): for j in range(image.shape[1]): rdn = random.random() if rdn < prob: output[i][j] = 0 elif rdn > thres: output[i][j] = 255 else: output[i][j] = image[i][j] return output
噪聲比依次是:0.1、0.05、0.01。
4.2. 添加高斯噪聲
# 添加高斯噪聲 # mean : 均值 # var : 方差 def gasuss_noiseImg(img_file1, out_file, mean=0, var=0.001): image = cv2.imread(img_file1, cv2.IMREAD_GRAYSCALE) image = np.array(image/255, dtype=float) noise = np.random.normal(mean, var ** 0.5, image.shape) out = image + noise if out.min() < 0: low_clip = -1. else: low_clip = 0. out = np.clip(out, low_clip, 1.0) out = np.uint8(out*255) cv2.imwrite(out_file, out) return out
5. 代碼測(cè)試
''' Created on 2019年5月20日 @author: xiaoyw ''' #coding: utf-8 import numpy as np import cv2 import os import random #函數(shù)部分略過(guò),見(jiàn)上文 if __name__ == '__main__': file1 = 'dog.jpg' move_img(file1,'timg11.jpg',1,'top',35) move_img(file1,'timg12.jpg',1,'left',35) move_img(file1,'timg13.jpg',1,'right',35) move_img(file1,'timg14.jpg',1,'bottom',35) cut_img(file1,'dog_cut.jpg',20,10,20,30) rotationImg(file1,'dog_ra1.jpg',30) rotationImg(file1,'dog_ra1.jpg',60) rotationImg(file1,'dog_ra2.jpg',-90) sp_noiseImg(file1,'dog_sp_01.jpg',0.01) sp_noiseImg(file1,'dog_sp_05.jpg',0.05) sp_noiseImg(file1,'dog_sp_10.jpg',0.1) resizeImg(file1,'dog_big.jpg',250,280,0) resizeImg(file1,'dog_small.jpg',100,200,0) splicing_img(file1,file1,'dog2.jpg',1,'right',50) translation_img(file1,'timg15.jpg',10,10) translation_img(file1,'timg16.jpg',-20,-30) pass
以上是“怎么使用Python OpenCV為CNN增加圖像樣本”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計(jì)公司行業(yè)資訊頻道!
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線(xiàn),公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性?xún)r(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿(mǎn)足用戶(hù)豐富、多元化的應(yīng)用場(chǎng)景需求。
本文名稱(chēng):怎么使用PythonOpenCV為CNN增加圖像樣本-創(chuàng)新互聯(lián)
URL網(wǎng)址:http://www.rwnh.cn/article36/cehdsg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司、云服務(wù)器、電子商務(wù)、定制開(kāi)發(fā)、外貿(mào)網(wǎng)站建設(shè)、網(wǎng)站導(dǎo)航
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容