iT邦幫忙

2024 iThome 鐵人賽

DAY 24
0
Python

探索 Python 世界:從語法基礎到圖像魔法系列 第 24

探索 Python 世界:從語法基礎到圖像魔法 Day24

  • 分享至 

  • xImage
  •  

OpenCV 圖像欲處理,裁切、翻轉、模糊化

圖像裁切

利用 imread 讀入的圖片 img 就是 Numpy 的陣列,因此可以用索引的方式指定使用者欲輸出的圖片範圍,下面的 (x, y) 代表原圖裁切的起點,並且裁切長寬為 (w, h) 的新圖片

import cv2

img = cv2.imread('../OpenCV/meme.jpg')

x = 50    
y = 50    
w = 200    
h = 200    

mosaic = img[y:y+h, x:x+w]    # 取得剪裁區域

cv2.imshow("new", mosaic)
cv2.waitKey(0)

https://ithelp.ithome.com.tw/upload/images/20241002/20168687sAgDSuiGQC.png

圖像翻轉

常用函數介紹:

cv2.flip(image, 0) 進行圖像翻轉,若參數為 0 垂直翻轉,為 1 水平翻轉,為 -1 垂直水平翻轉

cv2.transpose(image) 將圖像轉置(行列互換)

cv2.rotate(image, cv2.ROTATE_90_CLOCKWISE) 將圖像旋轉 90 度

cv2.flip() 範例:

import cv2

img = cv2.imread('../OpenCV/meme.jpg')


flipped_image = cv2.flip(img, 1) # 水平翻轉

cv2.imshow('before',img)
cv2.imshow("after", flipped_image)
cv2.waitKey(0)
  • cv2.flip(img, 1) 水平翻轉
    https://ithelp.ithome.com.tw/upload/images/20241002/20168687yxOYq0Mq1i.png
    https://ithelp.ithome.com.tw/upload/images/20241002/20168687m5S9ShfNsx.png

  • cv2.flip(img, 0) 垂直翻轉
    https://ithelp.ithome.com.tw/upload/images/20241002/20168687tUZufueu0M.png

  • cv2.flip(img, -1)垂直水平翻轉
    https://ithelp.ithome.com.tw/upload/images/20241002/20168687VMqV70MErl.png

cv2.transpose()範例:

import cv2

img = cv2.imread('../OpenCV/meme.jpg')


flipped_image = cv2.transpose(img) # 將圖像轉置(行列互換)

cv2.imshow('before',img)
cv2.imshow("after", flipped_image)
cv2.waitKey(0)

https://ithelp.ithome.com.tw/upload/images/20241002/20168687qK9zLJ4nez.png
https://ithelp.ithome.com.tw/upload/images/20241002/20168687xhlgqgqun7.png

cv2.rotate(image, cv2.ROTATE_90_CLOCKWISE)範例:

import cv2

img = cv2.imread('../OpenCV/meme.jpg')


flipped_image = cv2.rotate(img, cv2.ROTATE_90_CLOCKWISE) # 圖片旋轉 90 度

cv2.imshow('before',img)
cv2.imshow("after", flipped_image)
cv2.waitKey(0)

  • cv2.rotate(image, cv2.ROTATE_90_CLOCKWISE) 將圖像旋轉 90 度
    https://ithelp.ithome.com.tw/upload/images/20241002/20168687UfixFRxBL6.png
    https://ithelp.ithome.com.tw/upload/images/20241002/20168687eqWLSYSeZp.png

圖像模糊化

常用函數介紹:

cv2.blur(image, (w, h)) 均值模糊,使用指定大小的卷積核來平滑圖像。每个像素的值會被其周圖像的平均值所替代

cv2.GaussianBlur(image, (5, 5), 0) 高斯模糊,使用高斯函數作為卷積核,對圖像進行模糊處理。相比均值模糊,高斯模糊能夠更好地保留圖像邊緣

cv2.medianBlur(image, 5) 中值模糊,使用指定大小的卷積核,將每個像素的值替換成其周圍像素的中值

<小百科>

卷積核(濾波器):是一個用於圖像處理的矩陣,它通過卷積操作應用於圖像的每個像素,產生不同的效果,如模糊、銳化、邊緣檢測等。

<補充>:若卷積核為 (5, 5) 表示會從左上到右下,逐個對每個像素進行處理,並使用其周圍的 5x5 區域進行模糊處理,這些像素的值會根據捲積核內的權重進行加權平均,得到新的像素值,並將這個新值賦給該位置的像素

高斯核:是一種在圖像處理中用於模糊化或平滑圖像的卷積核。其核心概念基於高斯分佈,即以高斯分佈為基礎的數學函數,形狀呈鐘形曲線。(高斯核必須為積數,這樣才能確保有明確的中心點)

<補充>:與普通的捲積核不同,這 5x5 個像素的值並不會被簡單平均,而是根據高斯分佈進行加權平均,但在這個區域中,離中心像素越近的像素,其權重越大,離得越遠的像素權重越小。高斯分佈可以確保中心的像素值對結果的影響最大,而邊緣的像素值影響較小

cv2.blur()範例:

import cv2

img = cv2.imread('../OpenCV/meme.jpg')


blurred_image = cv2.blur(img, (5, 5))  

cv2.imshow('Blurred Img', blurred_image)  
cv2.destroyAllWindows() 
  • 卷積核 (5, 5)
    https://ithelp.ithome.com.tw/upload/images/20241002/20168687MR41UbquXM.png
  • 卷積核 (5, 5) 與 (10, 5) 比較
    https://ithelp.ithome.com.tw/upload/images/20241002/20168687NJysWRGbKt.png

cv2.GaussianBlur()範例:

import cv2

img = cv2.imread('../OpenCV/meme.jpg')

gaussian_blurred_image = cv2.GaussianBlur(img, (9, 9), 0) # 將高斯核設為 (9, 9) ,並把 sigmaX 設為 0,讓 OpenCV 自動計算合適的標準差

cv2.imshow('Before', img)
cv2.imshow('After', gaussian_blurred_image)  
cv2.waitKey(0)

https://ithelp.ithome.com.tw/upload/images/20241002/20168687Dp5Sr5d81D.png

cv2.medianBlur(image, 5)範例:

import cv2

img = cv2.imread('../OpenCV/meme.jpg')


median_blurred_image = cv2.medianBlur(img, 5)

cv2.imshow('Before', img)
cv2.imshow('After', median_blurred_image)
cv2.waitKey(0)

https://ithelp.ithome.com.tw/upload/images/20241002/20168687FQ4hSMgQMs.png

三種模糊方式對比

我將三種模糊化方式的卷積核與高斯核皆設為 7 ,以下為均值、高斯、中值模糊的差異
https://ithelp.ithome.com.tw/upload/images/20241002/20168687ZPGpfsBCKy.png

參考資料:
https://medium.com/jimmy-wang/opencv-%E5%9F%BA%E7%A4%8E%E6%95%99%E5%AD%B8%E7%AD%86%E8%A8%98-with-python-d780f571a57a


上一篇
探索 Python 世界:從語法基礎到圖像魔法 Day23
下一篇
探索 Python 世界:從語法基礎到圖像魔法 Day25
系列文
探索 Python 世界:從語法基礎到圖像魔法30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言