Python OpenCV 圖像處理再循環,第一階段復盤

      網友投稿 843 2022-05-28

      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]]

      單通道數據,呈現的是一個二維的數組。

      將單通道圖片呈現出來,顯示如下,單通道提取的圖像為灰度圖像。

      Python OpenCV 圖像處理再循環,第一階段復盤

      測試代碼如下:

      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小時內刪除侵權內容。

      上一篇:Kafka過期數據未老化原因及解決方案
      下一篇:ASP.NET程序設計 課程期末試卷
      相關文章
      亚洲色欲久久久综合网东京热| 色老板亚洲视频免在线观| 91在线亚洲综合在线| 久久久婷婷五月亚洲97号色| 亚洲av午夜成人片精品网站| 亚洲真人无码永久在线| 亚洲一区二区三区AV无码| 亚洲午夜福利在线观看| 亚洲精品国产精品乱码在线观看| 国产AV无码专区亚洲AWWW| 亚洲欧洲日产国码无码久久99| 亚洲女同成av人片在线观看| 亚洲精品无码久久千人斩| 亚洲啪啪AV无码片| 亚洲精品无码久久久久sm| 国产亚洲人成无码网在线观看 | 亚洲国产一区在线观看| 亚洲高清无在码在线电影不卡| 亚洲福利一区二区三区| 亚洲一级毛片视频| 精品国产日韩久久亚洲| 亚洲日韩久久综合中文字幕| 色欲色欲天天天www亚洲伊| 日韩色视频一区二区三区亚洲| 国内成人精品亚洲日本语音| 亚洲国产一级在线观看 | 久久久久亚洲爆乳少妇无| 伊人久久亚洲综合| 亚洲AV色香蕉一区二区| 精品亚洲成AV人在线观看| 亚洲专区一路线二| 亚洲乱妇老熟女爽到高潮的片| 精品久久亚洲一级α| 国产L精品国产亚洲区久久| 亚洲日韩欧洲乱码AV夜夜摸| 亚洲AV乱码一区二区三区林ゆな | 日本亚洲中午字幕乱码| 2048亚洲精品国产| 亚洲国产精品乱码一区二区 | 久久久无码精品亚洲日韩软件 | 亚洲精品天堂成人片AV在线播放|