版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第Python如何對圖像補全并分割成多塊補丁目錄題目思路代碼效果展示圖像分割方法總結1、閾值分割2、邊界分割(邊緣檢測)3、區(qū)域分割(區(qū)域生成)4、SVM分割(支持向量機)5、分水嶺分割6、Kmeans分割
題目
編寫一個程序,按照輸入的寬高,將測試圖像分割成多個補丁塊,超出圖像邊界的部分用黑色像素補齊
思路
按照輸入的寬高,先判斷原始圖像與其取模是否為零,判斷需不需要進行圖像填充
如果需要進行圖像填充,先計算出新圖像的寬和高((整除后+1)*指定寬高),然后新建一張全黑圖像,將原圖像默認為左上角位置粘貼進去
最后進行圖像裁剪,使用兩層for循環(huán),步長設定為補丁的寬高,使用crop函數(shù),指定補丁圖片的左、上、右、下坐標
代碼
importnumpyasnp
fromPILimportImage
#判斷是否需要進行圖像填充
defjudge(img,wi,he):
width,height=img.size
#默認新圖像尺寸初始化為原圖像
new_width,new_height=img.size
ifwidth%wi!=0:
new_width=(width//wi+1)*wi
ifheight%he!=0:
new_height=(height//he+1)*he
#新建一張新尺寸的全黑圖像
new_image=Image.new('RGB',(new_width,new_height),(0,0,0))
#將原圖像粘貼在new_image上,默認為左上角坐標對應
new_image.paste(img,box=None,mask=None)
new_image.show()
returnnew_image
#按照指定尺寸進行圖片裁剪
defcrop_image(image,patch_w,patch_h):
width,height=image.size
#補丁計數(shù)
cnt=0
forwinrange(0,width,patch_w):
forhinrange(0,height,patch_h):
cnt+=1
#指定原圖片的左、上、右、下
img=image.crop((w,h,w+patch_w,h+patch_h))
img.save("dog-%d.jpg"%cnt)
print("圖片補丁裁剪結束,共有{}張補丁".format(cnt))
defmain():
image_path="dog.jpg"
img=Image.open(image_path)
#查看圖像形狀
print("原始圖像形狀{}".format(np.array(img).shape))
#輸入指定的補丁寬高
print("輸入補丁寬高:")
wi,he=map(int,input().split(""))
#進行圖像填充
new_image=judge(img,wi,he)
#圖片補丁裁剪
crop_image(new_image,wi,he)
if__name__=='__main__':
main()
效果展示
原圖像使用了黑色像素填充
圖像裁剪,分割成小補丁
圖像分割方法總結
圖像分割是一種常用的圖像處理方法,可分為傳統(tǒng)方法和深度學習的方法。深度學習的方法比如:maskrcnn這類實例分割模型,效果比傳統(tǒng)的圖像分割方法要好的多,所以目前圖像分割領域都是用深度學習來做的。但是深度學習也有它的缺點,模型大、推理速度慢、可解釋性差、訓練數(shù)據(jù)要求高等。本文在這里僅討論傳統(tǒng)的圖像分割算法,可供學習和使用。
1、閾值分割
最簡單的圖像分割算法,只直接按照像素值進行分割,雖然簡單,但是在一些像素差別較大的場景中表現(xiàn)不錯,是一種簡單而且穩(wěn)定的算法。
defthresholdSegment(filename):
gray=cv2.imread(filename,cv2.IMREAD_GRAYSCALE)
ret1,th1=cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
th2=cv2.adaptiveThreshold(
gray,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,11,2)
th3=cv2.adaptiveThreshold(
gray,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,11,2)
ret2,th4=cv2.threshold(gray,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
images=[th1,th2,th4,th3]
imgaesTitle=['THRESH_BINARY','THRESH_MEAN',
'THRESH_OTSU','THRESH_GAUSSIAN']
plt.figure()
foriinrange(4):
plt.subplot(2,2,i+1)
plt.imshow(images[i],'gray')
plt.title(imgaesTitle[i])
cv2.imwrite(imgaesTitle[i]+'.jpg',images[i])
plt.show()
cv2.waitKey(0)
returnimages
2、邊界分割(邊緣檢測)
defedgeSegmentation(filename):
#讀取圖片
img=cv2.imread(filename)
#灰度化
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#高斯模糊處理:去噪(效果最好)
blur=cv2.GaussianBlur(gray,(9,9),0)
#Sobel計算XY方向梯度
gradX=cv2.Sobel(gray,ddepth=cv2.CV_32F,dx=1,dy=0)
gradY=cv2.Sobel(gray,ddepth=cv2.CV_32F,dx=0,dy=1)
#計算梯度差
gradient=cv2.subtract(gradX,gradY)
#絕對值
gradient=cv2.convertScaleAbs(gradient)
#高斯模糊處理:去噪(效果最好)
blured=cv2.GaussianBlur(gradient,(9,9),0)
#二值化
_,dst=cv2.threshold(blured,90,255,cv2.THRESH_BINARY)
#滑動窗口
kernel=cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(107,76))
#形態(tài)學處理:形態(tài)閉處理(腐蝕)
closed=cv2.morphologyEx(dst,cv2.MORPH_CLOSE,kernel)
#腐蝕與膨脹迭代
closed=cv2.erode(closed,None,iterations=4)
closed=cv2.dilate(closed,None,iterations=4)
#獲取輪廓
_,cnts,_=cv2.findContours(
closed.copy(),cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
c=sorted(cnts,key=cv2.contourArea,reverse=True)[0]
rect=cv2.minAreaRect(c)
box=0(cv2.boxPoints(rect))
draw_img=cv2.drawContours(img.copy(),[box],-1,(0,0,255),3)
#cv2.imshow("Box",draw_img)
#cv2.imwrite('./test/monkey.png',draw_img)
images=[blured,dst,closed,draw_img]
imgaesTitle=['blured','dst','closed','draw_img']
plt.figure()
foriinrange(4):
plt.subplot(2,2,i+1)
plt.imshow(images[i],'gray')
plt.title(imgaesTitle[i])
#cv2.imwrite(imgaesTitle[i]+'.jpg',images[i])
plt.show()
cv2.waitKey(0)
3、區(qū)域分割(區(qū)域生成)
defregionSegmentation(filename):
#讀取圖片
img=cv2.imread(filename)
#圖片寬度
img_x=img.shape[1]
#圖片高度
img_y=img.shape[0]
#分割的矩形區(qū)域
rect=(0,0,img_x-1,img_y-1)
#背景模式,必須為1行,13x5列
bgModel=np.zeros((1,65),np.float64)
#前景模式,必須為1行,13x5列
fgModel=np.zeros((1,65),np.float64)
#圖像掩模,取值有0,1,2,3
mask=np.zeros(img.shape[:2],np.uint8)
#grabCut處理,GC_INIT_WITH_RECT模式
cv2.grabCut(img,mask,rect,bgModel,fgModel,4,cv2.GC_INIT_WITH_RECT)
#grabCut處理,GC_INIT_WITH_MASK模式
#cv2.grabCut(img,mask,rect,bgModel,fgModel,4,cv2.GC_INIT_WITH_MASK)
#將背景0,2設成0,其余設成1
mask2=np.where((mask==2)|(mask==0),0,1).astype('uint8')
#重新計算圖像著色,對應元素相乘
img=img*mask2[:,:,np.newaxis]
cv2.imshow("Result",img)
cv2.waitKey(0)
4、SVM分割(支持向量機)
defsvmSegment(pic):
img=Image.open(pic)
img.show()
#顯示原始圖像
img_arr=np.asarray(img,np.float64)
#選取圖像上的關鍵點RGB值(10個)
lake_RGB=np.array(
[[147,168,125],[151,173,124],[143,159,112],[150,168,126],[146,165,120],
[145,161,116],[150,171,130],[146,112,137],[149,169,120],[144,160,111]])
#選取待分割目標上的關鍵點RGB值(10個)
duck_RGB=np.array(
[[81,76,82],[212,202,193],[177,159,157],[129,112,105],[167,147,136],
[237,207,145],[226,207,192],[95,81,68],[198,216,218],[197,180,128]])
RGB_arr=np.concatenate((lake_RGB,duck_RGB),axis=0)
#按列拼接
#lake用0標記,duck用1標記
label=np.append(np.zeros(lake_RGB.shape[0]),np.ones(duck_RGB.shape[0]))
#原本img_arr形狀為(m,n,k),現(xiàn)在轉化為(m*n,k)
img_reshape=img_arr.reshape(
[img_arr.shape[0]*img_arr.shape[1],img_arr.shape[2]])
svc=SVC(kernel='poly',degree=3)
#使用多項式核,次數(shù)為3
svc.fit(RGB_arr,label)
#SVM訓練樣本
predict=svc.predict(img_reshape)
#預測測試點
lake_bool=predict==0.
lake_bool=lake_bool[:,np.newaxis]
#增加一列(一維變二維)
lake_bool_3col=np.concatenate(
(lake_bool,lake_bool,lake_bool),axis=1)
#變?yōu)槿?/p>
lake_bool_3d=lake_bool_3col.reshape(
(img_arr.shape[0],img_arr.shape[1],img_arr.shape[2]))
#變回三維數(shù)組(邏輯數(shù)組)
img_arr[lake_bool_3d]=255.
img_split=Image.fromarray(img_arr.astype('uint8'))
#數(shù)組轉image
img_split.show()
#顯示分割之后的圖像
img_split.save('split_duck.jpg')
#保存
5、分水嶺分割
defwatershedSegment(filename):
img=cv2.imread(filename)
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,thresh=cv2.threshold(gray,0,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
#noiseremoval
kernel=np.ones((3,3),np.uint8)
opening=cv2.morphologyEx(thresh,cv2.MORPH_OPEN,kernel,iterations=2)
#surebackgroundarea
sure_bg=cv2.dilate(opening,kernel,iterations=3)
#Findingsureforegroundarea
dist_transform=cv2.distanceTransform(opening,cv2.DIST_L2,5)
ret,sure_fg=cv2.threshold(dist_transform,0.7*dist_transform.max(),255,0)
#Findingunknownregion
sure_fg=np.uint8(sure_fg)
unknown=cv2.subtract(sure_bg,sure_fg)
#Markerlabelling
ret,markers=cv2.connectedComponents(sure_fg)
#Addonetoalllabelssothatsurebackgroundisnot0,but1
markers=markers+1
#Now,marktheregionofunknownwithzero
markers[unknown==255]=0
markers=cv2.watershed(img,markers)
i
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 牧醫(yī)實訓室使用管理制度(3篇)
- 背包廠員工管理制度范本(3篇)
- 造價公司的安全管理制度(3篇)
- 鐵路管理制度標語圖片(3篇)
- 《GA 663-2006互聯(lián)網公共上網服務場所信息安全管理系統(tǒng)遠程通訊端接口技術要求》專題研究報告深度
- 養(yǎng)老院志愿服務制度
- 養(yǎng)老院入住老人精神慰藉與關愛制度
- 養(yǎng)老院服務質量投訴處理制度
- 企業(yè)員工培訓與技能提升計劃制度
- 企業(yè)內部保密責任追究制度
- 房產代持委托協(xié)議書
- GB/T 45451.1-2025包裝塑料桶第1部分:公稱容量為113.6 L至220 L的可拆蓋(開口)桶
- 湖南省長沙市芙蓉區(qū)2024-2025學年六年級上學期語文期末試卷
- 配電箱巡檢表
- GB/T 18238.3-2024網絡安全技術雜湊函數(shù)第3部分:專門設計的雜湊函數(shù)
- 2025屆山西省陽泉市陽泉中學高二生物第一學期期末質量檢測試題含解析
- 新人教版一年級數(shù)學下冊全冊教案(表格式)
- 無人機駕駛航空器飛行管理暫行條例(草案)知識考試題庫(85題)
- DB3502-Z 5026-2017代建工作規(guī)程
- 2023年廣東交通職業(yè)技術學院招聘考試真題
- 廣東省大灣區(qū)2023-2024學年高一上學期期末生物試題【含答案解析】
評論
0/150
提交評論