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