【opencv】imread 賦值 深拷貝淺拷貝
阿新 • • 發佈:2018-12-08
import cv2 import copy import os def filter_srcimg(dstimg): ss=3 srcimg=copy.deepcopy(dstimg) #aa=5 imgw=srcimg.shape[0] imgh=srcimg.shape[1] border_mat=[[0]*imgw]*imgh for ddd in range(0,1): for i in range(20,imgw-20): for j in range(20,imgh-20): loss=(8*float(srcimg[i][j][0])-float(srcimg[i-ss][j-ss][0])-float(srcimg[i-ss][j][0])-float(srcimg[i][j-ss][0])-float(srcimg[i-ss][j+ss][0])-float(srcimg[i+ss][j-ss][0])-float(srcimg[i][j+ss][0])-float(srcimg[i+ss][j][0])-float(srcimg[i+ss][j+ss][0]))/8 if loss>10 or srcimg[i][j][0]>180:#print loss #print "####,",srcimg[i][j][0] border_mat[i][j]=1 #res=int((float(srcimg[i-aa][j-aa][0])+float(srcimg[i-aa][j][0])+float(srcimg[i][j-aa][0]))/3) res=int(float(srcimg[i][j][0])-loss*3) if res<0: res=0 dstimg[i][j][0]=res dstimg[i][j][1]=dstimg[i][j][0] dstimg[i][j][2]=dstimg[i][j][0] #return dstimg if __name__=='__main__': for elem in os.listdir(os.getcwd()): if '.py' not in elem: img=cv2.imread(elem) cv2.imshow("1",img) cv2.waitKey(0) filter_srcimg(img) cv2.imshow("1",img) cv2.waitKey(0)
注意事項:
1、cv2.imread返回型別
img=cv2.imread("ddd.png")
返回一個(高度,寬度,通道數)的ndarray
返回的ndarray中的資料型別是numpy.uint8,即8位無符號整數(0-255)
修改畫素值:
img[0][0][0]=100
這裡注意,因為ndarray中的型別為uint8,故賦的值上溢位(>255)或下溢位(<0)時,會自動取模,而不會報錯!
2、深拷貝淺拷貝
(1)賦值時
對基本資料型別是值拷貝
對類是淺拷貝
如果對類進行值拷貝,需要使用深拷貝copy.deepcopy()
比較兩個引用是否指向同一物件——用id()檢視引用指向的地址,id()返回值為int
(2)函式傳參時
與賦值時相同
對基本資料型別是值拷貝
輸出是1
對類是淺拷貝
輸出是[2,1,1]