数字图像的加载、显示和输出
圖像處理的最基本工作,也是第一步工作:讀取、顯示和輸出圖片。
1.圖像讀取
opencv圖像讀取的函數是:imread(圖像路徑,加載模式);輸入參數有2個:
- IMREAD_UNCHANGED:取值:-1。不改變原始圖像的讀取模式。
- IMREAD_GRAYSCALE:取值:0。將圖像轉換成灰度圖讀取。
- IMREAD_COLOR:取值:1。為默認缺省值,將圖像轉換成3通道彩色圖像讀取。
- IMREAD_ANYDEPTH:取值:2。讀取后是灰度圖。這個沒搞明白是什么意思。知道的朋友不妨留言指教,不甚感激。
- IMREAD_ANYCOLOR:取值:4。無損讀取原始圖像。源圖像為彩色圖像就讀取為3通道彩色圖像,源圖像為灰度圖就讀取為灰度圖。
為更一步準確掌握這些參數的區別,用3幅圖像測試下,這三幅圖像分別為:”scooter.png” :帶alpha通道的彩色圖像; “lenna.bmp”:3通道彩色圖像; “moon.bmp”:灰度圖像。如下圖所示:
輸出結果:
scooter.png -1 (512, 512, 4) scooter.png 0 (512, 512) scooter.png 1 (512, 512, 3) scooter.png 2 (512, 512) scooter.png 4 (512, 512, 3) lenna.bmp -1 (512, 512, 3) lenna.bmp 0 (512, 512) lenna.bmp 1 (512, 512, 3) lenna.bmp 2 (512, 512) lenna.bmp 4 (512, 512, 3) moon.bmp -1 (640, 662) moon.bmp 0 (640, 662) moon.bmp 1 (640, 662, 3) moon.bmp 2 (640, 662) moon.bmp 4 (640, 662)我們可以從讀入圖像后的shape中看出一些端倪。
- 當取值為-1時,即讀取模式為IMREAD_UNCHANGED時,源圖像是什么樣就是什么樣。
- 當取值為0時,即讀取模式為IMREAD_GRAYSCALE時,都讀取成灰度圖像。
- 當取值為1時,即讀取模式為IMREAD_COLOR時,不管源圖像是什么,都轉換成3通道圖像。
- 當取值為2時,即讀取模式為IMREAD_ANYDEPTH時,都讀取成了灰度圖,沒搞明白與上面的IMREAD_GRAYSCALE有什么區別。
- 當取值為4時,即讀取模式為IMREAD_ANYCOLOR時,源圖像為彩色圖像就讀取為3通道彩色圖像,源圖像為灰度圖就讀取為灰度圖。
一般來說,將圖像讀取成統一的模式對于后續的處理非常重要,一般都使用3通道的彩色圖像進行處理,所以默認值是1,即不管源圖像是什么,統一轉成3通道的圖像。對于灰度圖,也是3通道,只不過每個通道的值都相等。
如果需要特殊處理,例如只處理灰度圖,或需要alpha通道,那么就可以靈活使用其它的讀取模式。
2.圖像顯示
import cv2 lenna_path = "lenna.bmp" img = cv2.imread(lenna_path) cv2.imshow('lenna', img) cv2.waitKey()opencv中的圖像顯示函數是imshow(title,img),title是顯示圖片的窗口標題,img就是要顯示的圖像。如果不添最后一句cv2.waitKey(),執行時窗口是一閃而過。waitKey()表示無限等待。中間可以輸入數值,如5000,cv2.waitKey(5000),表示5000毫秒即5秒后自動關閉窗口。
lenna_path = "lnnea.bmp" img = cv2.imread(lenna_path) cv2.imshow('lenna', img) cv2.waitKey()輸出:
error: (-215) size.width>0 && size.height>0 in function cv::imshow從報錯信息可以推斷,是圖像的size有問題,即沒有得到圖像的size。換句話說就是沒有讀取到源圖像。仔細檢查發現是文件名弄錯了。
這里需要注意,調用imread(),就算圖像的路徑是錯的,或者沒有這張圖片, 也不會報錯,但得到的是None。接著往下使用imshow()顯示的話就會報錯。
所以下次看到這個size的報錯信息,一定是圖片路徑或圖片名稱錯了。
opencv對多個圖片輸出在同一個窗口并沒有直接的支持手段,但有時候我們會有這個需求,這時使用matplotlib搭配使用比較合適,這個以后再說。
3.圖像輸出
lenna_path = "Input\\lenna.bmp" img = cv2.imread(lenna_path) cv2.imwrite('Output\\lenna.jpg', img)opencv中的圖像輸出函數是imwrite(path, img);path是輸出圖片的路徑和名稱,格式轉換在這里只需要換個后綴名即可。img就是要保存的圖像。
需要注意的是,如果輸出時,指定的輸出目錄不存在,例如不存在Output目錄,imwrite()不會報錯,但也不會自動創建目錄然后輸出。這樣做的結果是什么也沒有發生。
總結
以上是生活随笔為你收集整理的数字图像的加载、显示和输出的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 为什么OpenCV3在Python中导入
- 下一篇: 为什么matplotlib显示openc