本文目錄一覽:
- 1、讀取圖片
- 2、opencv實現圖像二值化時總是在如下代碼最後三四行出現中斷是怎麼回事啊?不是三通道可以轉化為單通道嗎。
- 3、怎麼用opencv和python,只保留深藍色部分,其他區域變為黑色
- 4、opencv三通道的iplimage怎麼轉為單通道
- 5、數據集是Kinect獲取的三通道深度圖,怎麼變成單通道且無信息損失?
讀取圖片
python基礎——讀取圖片
圖像後綴名的轉換:
要注意的是:對於彩色圖像,不管其格式是png,還是bmp,或者jpg,
在PIL中 ,使用Image模塊的open()函數打開後,返回的圖像對象的模式都是 RGB ,對於灰度圖像,不管其圖像格式是PNG,還是BMP,JPG,打開後,其模式為灰度L。
PNG BMP JPG彩色圖像格式之間的轉換:可以通過Image模塊的open函數和save函數,具體來說,在打開這些圖像時,PIL會將他們解碼成三通道的RGB圖像。用戶可以基於RGB進行處理。處理完畢後可以將其處理結果保存成PNG BMP JPG中任何格式。
PNG BMP JPG灰度圖像格式之間的轉換,同理也可以通過類似途徑,只是解碼後時模式為L的圖像。
python庫可以用來讀取圖片的庫
1. PIL.Image.open
無論是jpg還是png都能準確讀取,PIL.Image.open 不直接返回numpy對象,可以用numpy提供的函數進行轉換;
其他模塊都直接返回numpy.ndarray對象,通道順序為RGB,通道值得默認範圍為0-255。
拓展:
利用PIL中的Image函數讀取出來不是array格式,這時候需要用np.asarray() 或者np.array()函數 。
區別:np.array() 是深拷貝,np.asarray() 是淺拷貝
關於深拷貝和淺拷貝,這裡給出一個說明:
Python 中的對象之間賦值時是按引用傳遞的,如果需要拷貝對象,需要使用標準庫中的copy模塊。
1. copy.copy 淺拷貝 只拷貝父對象,不會拷貝對象的內部的子對象。
2. copy.deepcopy 深拷貝 拷貝對象及其子對象
一個很好的例子:
2. cv2.imread
使用opencv讀取圖像,直接返回numpy.ndarray 對象,通道順序為BGR ,注意是BGR,通道值默認範圍0-255
cv2.imread():讀入圖片,共兩個參數:第一個參數為要讀入的圖片文件名,第二個參數為如何讀取圖片(cv2.IMREAD_COLOR:讀入一副彩色圖片;cv2.IMREAD_GRAYSCALE:灰度圖片;cv2.IMREAD_UNCHANGED:讀入一幅圖片,並包括其alpha通道。)
cv2.imread()不能有中文路徑,否則讀取不出來
cv2.imread() 讀出來同樣是array形式,但是如果是單通道的圖,讀出來的是三通道的。
3. matplotlib.image.imread
用於顯示圖片matplotlib 用於讀取圖片並且讀取出來就是array格式
解決使用plt.savefig 保存圖片時一片空白 : 在plt.show() 之前調用 plt.savefig();
4. scipy.ndimage.imread
scipy.ndimage.imread(*args, **kwds) Use “matplotlib.pyplot.imread“ instead.
Returns:imread:ndarray(多維數組)
5. scipy.misc.imread
scipy.misc.imread(name, flatten=False, mode=None)
Use “imageio.imread“ instead.
返回:imread: ndarray。通過讀取圖像獲得的陣列 。讀出來是array 形式,並且按照(H,W,C)形式保存
4. skimage.io.imread
scikit-image和numpy,matplotlib,scikit-learn等包都是Scipy項目的成員,通用numpy數組作為基本數據格式。在python中載入包名為skimage:所得即為numpy數組。
io.imread讀出圖片格式是uint8(unsigned int);value是numpy array;圖像數據是以RGB的格式進行存儲的,通道值默認範圍0-255。
opencv實現圖像二值化時總是在如下代碼最後三四行出現中斷是怎麼回事啊?不是三通道可以轉化為單通道嗎。
我試過是沒有問題的。建議你看一下OpenCV庫是不是正確引入了。
我的是Qt開發環境,運行結果:
怎麼用opencv和python,只保留深藍色部分,其他區域變為黑色
1、首先明確深藍的數據範圍;
2、將圖片轉換到HSV空間,並分離三個通道為新的三個單通道圖片;
3、H圖片使用cvInRangeS獲取“藍”色區域的MASK。“藍”在色度輪盤的值為240
4、同上,S圖片獲取色純度大於一定值的MASK;
5、同上,V圖片獲取亮度在一定範圍內的MASK;
6、上述三圖二值化以後,做“與”運算,成為最終MASK;
7、用這個新生成的MASK去處理原圖;
opencv三通道的iplimage怎麼轉為單通道
IplImage *imgMono,*imgClr; //得到單通道圖象 imgMono=cvLoadImage( “tuxiang.bmp”,0); //定義一個3通道圖象 imgClr = cvCreateImage(cvSize(imgMono-width,imgMono-height), IPL_DEPTH_8U, 3); cvCvtColor(imgMono, imgClr, CV_GRAY2BGR);
數據集是Kinect獲取的三通道深度圖,怎麼變成單通道且無信息損失?
在python中numpy是很好用的數據處理包。不了解你說的數據結構但是可以嘗試把數據轉成numpy的md數組格式。之後可以在數組中進行檢查看是不是所有的三通道都相等。如果說這樣的話那麼理論上三通道和三通道代表的信息都是一樣的,直接在裡面切片不會影響結果。
原創文章,作者:KHTT,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/143416.html