- 本專欄代碼地址
https://github.com/xiawei20161308104/xv_opencv_tutorials
- 本節(jié)代碼路徑
xv_opencv_tutorials/ImageProcessinginOpenCV/load_img.py
0.本節(jié)知識點(diǎn)
- 創(chuàng)建窗口
namedWindow
- 從本地加載圖像
imread
- 在窗口中展示圖像
imshow
- 將圖像寫入文件
imwrite
- 關(guān)閉窗口
destroyWindow destroyAllWindows
1.創(chuàng)建窗口
opencv提供cv.namedWindow
函數(shù)實(shí)現(xiàn)創(chuàng)建一個(gè)窗口功能
import cv2 as cv
# 參數(shù)一winname:string類型的窗口名稱,參數(shù)二flags:窗口類型,使用規(guī)定好的類型,默認(rèn)WINDOW_AUTOSIZE
cv.namedWindow('img', cv.WINDOW_AUTOSIZE)
cv.waitKey(0)
flags窗口類型的可選參數(shù)
一般使用cv.WINDOW_NORMAL
就可以啦
函數(shù)名稱 | 應(yīng)用 |
---|---|
cv.WINDOW_NORMAL | 可以用鼠標(biāo)調(diào)整窗口大小,將全屏窗口切換正常大小 |
cv.WINDOW_AUTOSIZE | 不能改變大小,圖像顯示為其原始大小,但也受到屏幕分辨率的影響 |
cv.WINDOW_FULLSCREEN | 全屏顯示 |
cv.WINDOW_FREERATIO | 調(diào)整圖片大小的時(shí)候,不考慮原始比率 |
cv.WINDOW_KEEPRATIO | 調(diào)整圖片大小的時(shí)候,保持原始比率不變 |
cv.WINDOW_OPENGL | 支持opengl |
注意
- 若填入的
winname
重復(fù),則函數(shù)不執(zhí)行,例如:
此時(shí)的img圖像是第一個(gè)創(chuàng)建的img,第三個(gè)不執(zhí)行。 -
WINDOW_AUTOSIZE
可能會出現(xiàn)適配不好的情況。左圖img只顯示了上半截,顯示不完全,右圖為原圖。
2.從本地加載圖像
opencv提供cv.imread
函數(shù)實(shí)現(xiàn)讀取圖像功能??梢宰x取的類型有:
import cv2 as cv
cv.namedWindow('img WINDOW_NORMAL', cv.WINDOW_NORMAL)
# 讀取圖像
# 參數(shù)一filename:string類型的圖片路徑,參數(shù)二flags:讀取方式,比如讀取哪個(gè)通道,哪些保留哪些丟棄等。使用規(guī)定好的類型。
img = cv.imread("../imgs/opencv.png")
cv.imshow('img WINDOW_NORMAL', img)
cv.waitKey(0)
flags讀取方式的可選參數(shù)
補(bǔ)充:
jpg
: 格式是有損壓縮 ,24 bit真彩色,不支持動畫、不支持透明色
。在壓縮過程中圖像的品質(zhì)會遭受破壞。一張圖片多次上傳下載后,圖片逐漸會失真。PNG
:格式是無損數(shù)據(jù)壓縮,PNG格式有8位、24位、32位三種形式,其中8位PNG支持兩種不同的透明形式(索引透明和alpha透明),24位PNG不支持透明,32位PNG在24位基礎(chǔ)上增加了8位透明通道(32-24=8)可展現(xiàn)256級透明程度
。imread
函數(shù)默認(rèn)不讀取透明度,所以若有一些的特殊格式的圖像需要進(jìn)行flag標(biāo)記。
函數(shù)名稱 | 應(yīng)用 |
---|---|
cv.IMREAD_UNCHANGED | 讀取原始圖像不改變,可以讀取到png的透明通道 |
cv.IMREAD_GRAYSCALE | 用編碼器內(nèi)部轉(zhuǎn)換為灰度圖 |
cv.IMREAD_COLOR | 默認(rèn)配置,轉(zhuǎn)為3通道BGR圖像 |
cv.IMREAD_REDUCED_GRAYSCALE_2/ | 轉(zhuǎn)為灰度圖,尺寸減小1/2 |
cv.IMREAD_REDUCED_GRAYSCALE_4/ | 轉(zhuǎn)為灰度圖,尺寸減小1/4 |
cv.IMREAD_REDUCED_GRAYSCALE_8 | 轉(zhuǎn)為灰度圖,尺寸減小1/8 |
cv.IMREAD_REDUCED_COLOR_2 | 轉(zhuǎn)為BGR彩圖,尺寸減少1/2(還可以減小1/4,1/8) |
demo
import cv2 as cv
cv.namedWindow('img IMREAD_GRAYSCALE', cv.WINDOW_NORMAL)
cv.namedWindow('img1 original', cv.WINDOW_NORMAL)
cv.namedWindow('img2 original had alpha', cv.WINDOW_NORMAL)
# 讀取圖像
# 參數(shù)一filename:string類型的圖片路徑,參數(shù)二flags:讀取方式,比如讀取哪個(gè)通道,哪些保留哪些丟棄等。使用規(guī)定好的類型。
# 以灰度圖形式讀取
img = cv.imread("../imgs/opencv.png", cv.IMREAD_GRAYSCALE)
print("灰度圖大小為:", img.shape)
# 以默認(rèn)形式讀取原圖,沒有透明度通道
img1 = cv.imread("../imgs/opencv.png")
print("默認(rèn)方式讀取大小為:", img1.shape)
# 以IMREAD_UNCHANGED形式讀取原圖,有透明度通道
img2 = cv.imread("../imgs/opencv.png", cv.IMREAD_UNCHANGED)
print("不忽略透明度通道大小為:", img2.shape)
# 展示圖像
cv.imshow('img IMREAD_GRAYSCALE', img)
cv.imshow('img1 original', img1)
cv.imshow('img2 original had alpha', img2)
# 窗口停留,0代表無限時(shí)停留
cv.waitKey(0)
控制臺輸出:
灰度圖大小為: (610, 570)
默認(rèn)方式讀取大小為: (610, 570, 3)
不忽略透明度通道大小為: (610, 570, 4) 看!有一個(gè)透明通道吧
注意:
文件丟失
、權(quán)限不正確
、格式不受支持
或無效
等情況,會返回空矩陣
- 按照
BGR
通道讀取- 讀取類型為
IMREAD_GRAYSCALE
時(shí)候,和cvtColor()轉(zhuǎn)灰度圖的結(jié)果可能不同- 根據(jù)圖片本身內(nèi)容決定類型,而不是根據(jù)文件的擴(kuò)展名
- 標(biāo)志位為
IMREAD_UNCHANGED
是原始的不會改變的讀取方式- 默認(rèn)情況下,像素?cái)?shù)必須小于
2^30
??梢允褂孟到y(tǒng)變量OPENCV_IO_MAX_IMAGE_PIXELS
設(shè)置限制
3.在窗口中展示圖像
opencv提供imshow()
函數(shù),來在指定窗口加載圖像
cv.namedWindow('img IMREAD_GRAYSCALE', cv.WINDOW_NORMAL)
# 參數(shù)一winname:string類型的窗口名稱,參數(shù)二mat:圖像。配合cv.namedWindow使用。
# 展示效果受到圖像本身和namedWindow的類型影響。WINDOW_NORMAL能顯示大于屏幕分辨率的圖像。
cv.imshow('img IMREAD_GRAYSCALE', img)
注意
當(dāng)圖像大小不是255的時(shí)候,一般采取除法或者乘法轉(zhuǎn)為0-255顯示
- 如果圖像像素大小為8bit,也就是2的8次方=256像素的,直接顯示。
- 如果圖像是16bit的,也就是2的16次方=256*256=25536像素的,會映射為0-255大小顯示。
- 如果是浮點(diǎn)數(shù)0-1的,會映射為0-255大小顯示
4.將圖像寫入文件
保存圖像有兩種方法
-
按下Ctrl+S將顯示本地對話框自行選擇保存圖像。按下Ctrl+C會復(fù)制圖像到剪切板
-
結(jié)合waitKey用代碼控制
# waitKey(0)將無限顯示窗口,直到按下任何鍵為止,適用于想顯示圖像的時(shí)候。 # waitKey(25)將顯示一幀并等待大約25ms的按鍵,適用于逐幀顯示視頻的時(shí)候。 k=cv.waitKey(0) # 在無限顯示窗口的時(shí)候,按下s,則保存到本地路徑 #imwrite參數(shù)一filename:保存的路徑,參數(shù)二img要保存的圖像,參數(shù)三params可選,對特定格式進(jìn)行編碼 if k == ord("s"): cv.imwrite("opencv1.png", img)
注意
保存的時(shí)候可以決定圖像的保存形式。
只有8bit的單通道
或者BGR三通道
能用這個(gè)函數(shù)直接保存,其他的需要特定格式或者特殊處理,例如16bit需要特定保存為PNG, JPEG 2000, 和TIFF 形式。
5.關(guān)閉窗口
程序最后加cv.destroyAllWindows()
就好啦,釋放一下資源。其實(shí)在簡單程序中,加不加都行,關(guān)閉程序就自動釋放了。文章來源:http://www.zghlxwxcb.cn/news/detail-420566.html
6.整合代碼
以上所有知識點(diǎn)的整合,通常圖片讀取步驟,按需取用。
文件結(jié)構(gòu):
完整代碼:文章來源地址http://www.zghlxwxcb.cn/news/detail-420566.html
import cv2 as cv
import sys
# 創(chuàng)建窗口
# 參數(shù)一winname:string類型的窗口名稱,參數(shù)二flags:窗口類型,使用規(guī)定好的類型,默認(rèn)WINDOW_AUTOSIZE
cv.namedWindow('img IMREAD_GRAYSCALE', cv.WINDOW_NORMAL)
cv.namedWindow('img1 original', cv.WINDOW_NORMAL)
cv.namedWindow('img2 original had alpha', cv.WINDOW_NORMAL)
# 讀取圖像
# 參數(shù)一filename:string類型的圖片路徑,參數(shù)二flags:讀取方式,比如讀取哪個(gè)通道,哪些保留哪些丟棄等。使用規(guī)定好的類型。
# 以灰度圖形式讀取
img = cv.imread("../imgs/opencv.png", cv.IMREAD_GRAYSCALE)
# 因?yàn)閕mread讀取不到的時(shí)候不會報(bào)錯(cuò),所有這里需要判空
if img is None:
sys.exit("Could not read the image.")
print("灰度圖大小為:", img.shape)
# 以默認(rèn)形式讀取原圖,沒有透明度通道
img1 = cv.imread("../imgs/opencv.png")
print("默認(rèn)方式讀取大小為:", img1.shape)
# 以IMREAD_UNCHANGED形式讀取原圖,有透明度通道
img2 = cv.imread("../imgs/opencv.png", cv.IMREAD_UNCHANGED)
print("不忽略透明度通道大小為:", img2.shape)
# 展示圖像
# 參數(shù)一winname:string類型的窗口名稱,參數(shù)二mat:圖像。配合cv.namedWindow使用。
cv.imshow('img IMREAD_GRAYSCALE', img)
cv.imshow('img1 original', img1)
cv.imshow('img2 original had alpha', img2)
# waitKey(0)將無限顯示窗口,直到按下任何鍵為止,適用于想顯示圖像的時(shí)候。
# waitKey(25)將顯示一幀并等待大約25ms的按鍵,適用于逐幀顯示視頻的時(shí)候。
k = cv.waitKey(0)
if k == ord("s"):
cv.imwrite("../imgs/opencv1.png", img)
cv.destroyAllWindows()
到了這里,關(guān)于opencv+圖像處理(GUI)1-0圖像:創(chuàng)建加載顯示保存關(guān)閉的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!