Python OpenCV 圖像處理再循環,第一階段復盤
Python OpenCV 365 天學習計劃,與橡皮擦一起進入圖像領域吧。本篇博客是這個系列的第 40 篇。
該系列文章導航參考:https://blog.csdn.net/hihell/category_10688961.html
基礎知識鋪墊
經過一個階段的努力,我們已經來到了 Python OpenCV 學習的第二個階段,本階段將對之前的學習的內容查漏補缺,再進一步。
圖像中的像素
我們在研究一下圖像中像素是如何呈現的吧。
首先編寫一個普普通通的圖片展示代碼。
import cv2 as cv image = cv.imread("./test.jpg") cv.imshow("image",image) # 輸出像素 print(image.shape) print(image[:5,:]) cv.waitKey(0) cv.destroyAllWindows()
輸出數據如下,由于是彩色圖像,呈現的是一個三維數組。
(640, 640, 3) [[[212 151 87] [175 104 41] [231 137 78] ... [150 144 145] [188 186 132] [196 195 115]] [[255 229 160] [188 118 51] [196 106 42] ... [206 190 178] [216 200 153] [199 183 117]]
數組與列表的區別,可以仔細觀察一下。
通過輸出類型,可以獲取 image 是
三維數組最內層的三個數字就是一個像素的取值,分別表示 BGR,取值范圍是 0~255 合計 256 種取值。
每個值都表示的是亮度,所以 0 表示最暗,255 表示最亮。
獲取單通道數據與像素值的加減操作
采用下述代碼,可以獲取圖像單通道數據
print(image[:5,:,0])
得到的數據如下:
[[212 175 231 ... 150 188 196] [255 188 196 ... 206 216 199] [251 180 201 ... 233 236 220] [173 182 232 ... 237 244 236] [187 210 233 ... 255 255 235]]
單通道數據,呈現的是一個二維的數組。
將單通道圖片呈現出來,顯示如下,單通道提取的圖像為灰度圖像。
測試代碼如下:
import cv2 as cv from matplotlib import pyplot as plt image = cv.imread("./test.jpg") cv.imshow("image", image) # 輸出像素 print(image.shape) image[:, :, 0] = 0 image[:, :, 1] = 0 r = image[:, :, 2] cv.imshow("dst",image) cv.imshow("r",r) cv.waitKey(0)
如果希望獲取到的通道呈現出 BGR 中的顏色,只需要設置其他通道值為 0,那獲取到的圖像依然就是彩色圖像。
下述代碼將得到偏黃色的圖像,因為 G(綠色)+R(紅色) = Y(黃色)。
image[:, :, 0] = 0 cv.imshow("dst",image)
接下來咱可以實現圖像的加減操作,具體代碼如下:
import cv2 as cv from matplotlib import pyplot as plt image = cv.imread("./test.jpg") cv.imshow("image", image) print(image[:1, :]) print("像素值+10") image = image+10 print(image[:1, :]) cv.imshow("dst", image) cv.waitKey(0)
查看像素的輸出,發現每個值都進行了添加操作。
但是當像素值增加之后,超過了 255,結果會對 256 取余,例如 212+50=262 % 256 = 6。
邊界填充
今天順便補充一下邊界填充的相關知識,核心用到的函數是 ``cv2.copyMakeBorder` ,函數原型如下:
dst = cv2.copyMakeBorder(src, top, bottom, left, right, borderType[, dst[, value]])
其中最重要的參數就是 borderType ,定義要添加邊框的類型,其它的只是一些數值。
borderType 具體取值如下:
cv2.BORDER_CONSTANT:添加的邊界框像素值為常數(需要額外再給定一個參數,就是 value 參數);
cv2.BORDER_REFLECT:添加的邊框像素將是邊界元素的鏡面反射,類似于 gfedcb|abcdefgh|gfedcba,注意豎線左右的值即可;
cv2.BORDER_REFLECT_101 or cv2.BORDER_DEFAULT:和上面類似,但是有一些細微的不同,類似于 gfedcb|abcdefgh|gfedcba,注意豎線左右的數值,沒有 a;
cv2.BORDER_REPLICATE:使用最邊界的像素值代替,類似于 aaaaaa|abcdefgh|hhhhhhh,直接延伸邊界像素值;
cv2.BORDER_WRAP:cdefgh|abcdefgh|abcdefg。
具體的你可以在 官方手冊 繼續學習。
最后一個 value 參數:如果 borderType 為 cv2.BORDER_CONSTANT 時需要填充的常數值。
dst:添加完邊框的新圖像,需要記住圖像的新尺寸為 (src.shape[1]+left+right, src.shape[0]+top+bottom)。
通過下述代碼,進行完成的呈現。
import cv2 as cv from matplotlib import pyplot as plt image = cv.imread("./t1.png") b, g, r = cv.split(image) rgb_img = cv.merge((r, g, b)) replicate = cv.copyMakeBorder(rgb_img, 100, 100, 100, 100, cv.BORDER_REPLICATE) reflect = cv.copyMakeBorder(rgb_img, 100, 100, 100, 100, cv.BORDER_REFLECT) reflect101 = cv.copyMakeBorder( rgb_img, 100, 100, 100, 100, cv.BORDER_REFLECT_101) wrap = cv.copyMakeBorder(rgb_img, 100, 100, 100, 100, cv.BORDER_WRAP) constant = cv.copyMakeBorder( rgb_img, 100, 100, 100, 100, cv.BORDER_CONSTANT, value=(0, 255, 0)) plt.subplot(231), plt.imshow(rgb_img), plt.title('ORIGINAL') plt.subplot(232), plt.imshow(replicate), plt.title('REPLICATE') plt.subplot(233), plt.imshow(reflect), plt.title('REFLECT') plt.subplot(234), plt.imshow(reflect101), plt.title('REFLECT_101') plt.subplot(235), plt.imshow(wrap), plt.title('WRAP') plt.subplot(236), plt.imshow(constant), plt.title('CONSTANT') plt.show() cv.waitKey(0)
運行結果如下圖所示,注意 plt 繪圖后圖片的橫縱坐標表示的是圖像的像素數量。學習的時候,對比著剛才的字母說明,然后在看著圖片學習一下,很容易可以掌握。
橡皮擦的小節
希望今天的 1 個小時你有所收獲,我們下篇博客見~
使用大閃光術(CTRL+A)發現橡皮擦私人聯系方式。
私人聯系方式:moshanba
相關閱讀
技術專欄
Python 爬蟲 100 例教程,超棒的爬蟲教程,立即訂閱吧
Python 爬蟲小課,精彩 9 講
今天是持續寫作的第
82
/ 100 天。
如果你想跟博主建立親密關系,可以關注同名公眾號
夢想橡皮擦
,近距離接觸一個逗趣的互聯網高級網蟲。
博主 ID:夢想橡皮擦,希望大家
、
評論
、
。
OpenCV Python 圖像處理
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。