[OpenCV基礎][Python]遮罩,旋轉,輪廓應用濾除斑點

更新 發佈閱讀 14 分鐘

[影像處理_OpenCV Python]使用Python撰寫影像處理功能,圖片遮罩或濾除掉不要的地方,旋轉圖片

前言

以下範例將呈現影像處理三種不同的應用:

遮罩的實現

利用cv2.add用法來實現mask,黑色的像素0則會遮蔽掉呈現黑色,白色像素255則會透明的方式顯現出原圖的樣子

濾除不要的斑點(白點)

利用 cv2.findContours用法來實現mask,黑色的像素0則會遮蔽掉呈現黑色,白色像素255則會透明的方式顯現出原圖的樣子

旋轉圖片

利用cv2.warpAffinecv2.getRotationMatrix2D實現圖片旋轉

結果圖

raw-image
raw-image
raw-image

程式碼範例及連結


程式範例說明

遮罩的實現

import cv2
import numpy as np
import matplotlib.pyplot as plt
'''
遮罩的實現
利用cv2.add用法來實現mask,黑色的像素0則會遮蔽掉呈現黑色,白色像素255則會透明的方式顯現出原圖的樣子
'''
# 建立300*300的白色圖像
img1 = cv2.imread('./images.jpg')
img2 = np.zeros((224, 224), dtype=np.uint8)
# 在第二張圖像上繪製一個白色圓形
cv2.circle(img2, (112, 112), 70, 255, thickness=cv2.FILLED)

# 將利用遮罩的方式取出想要的畫面
# 將彩色圖片轉換為灰度圖
img1_gray = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)

# 將灰度圖作為遮罩,進行相加
result = cv2.add(img1_gray, img1_gray, mask = img2)

# 將結果轉換回彩色圖
result_colored = cv2.cvtColor(result, cv2.COLOR_BGR2RGB)
img2 = cv2.cvtColor(img2, cv2.COLOR_GRAY2BGR)
# 顯示原始圖片和結果
plt.subplot(1, 3, 1), plt.imshow(img1), plt.title('Image 1'), plt.axis('off')
plt.subplot(1, 3, 2), plt.imshow(img2), plt.title('Image 2'), plt.axis('off')
plt.subplot(1, 3, 3), plt.imshow(result_colored), plt.title('Result with Mask'), plt.axis('off')
plt.show()
  1. import cv2import numpy as npimport matplotlib.pyplot as plt:引入OpenCV、NumPy和Matplotlib庫,這些庫用於處理圖像和顯示結果。
  2. img1 = cv2.imread('./images.jpg'):讀取一張名為"images.jpg"的圖片,存儲在img1中。
  3. img2 = np.zeros((224, 224), dtype=np.uint8):創建一張大小為224x224的黑色圖片,存儲在img2中,後面將用於遮罩用。
  4. cv2.circle(img2, (112, 112), 70, 255, thickness=cv2.FILLED):在img2上畫一個白色的圓形,中心座標為(112, 112),半徑為70,顏色為255全白色,並且使用cv2.FILLED參數填充整個圓形內部。
  5. img1_gray = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY):將彩色圖片img1轉換為灰度圖,存儲在img1_gray中。
  6. result = cv2.add(img1_gray, img1_gray, mask=img2):利用cv2.add將兩張灰度圖相加,其中img2的白色部分將透明顯示原圖,黑色部分則被遮罩掉。
  7. result_colored = cv2.cvtColor(result, cv2.COLOR_BGR2RGB):將最終的結果轉換回彩色圖,以便在Matplotlib中顯示。
  8. img2 = cv2.cvtColor(img2, cv2.COLOR_GRAY2BGR):將img2轉換回彩色圖,以便在Matplotlib中顯示。
  9. Matplotlib的部分:使用plt.subplotplt.imshow來顯示原始圖片、遮罩圖片和最終帶有遮罩效果的結果圖片。最後使用plt.show()顯示整體結果。

濾除不要的斑點(白點)

import cv2
import numpy as np
import matplotlib.pyplot as plt

'''
濾除不想要的斑點(白點)
cv2.findContours 主要用於找尋物體的輪廓,通常在二值圖像(黑白圖像)中找尋物體的邊界。黑白圖像中的白色區域視為物體,黑色區域視為背景,findContours 會找尋物體和背景之間的邊界
'''
def filter_contours_by_area(img:np.ndarray,min_area_threshold):
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 找到輪廓
contours, _ = cv2.findContours(img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
#找出最大最小輪廓方便設定
max_contour = max(contours, key=cv2.contourArea)
max_area = cv2.contourArea(max_contour)
min_contour = min(contours, key=cv2.contourArea)
min_area = cv2.contourArea(min_contour)
print(f'max_area:{max_area}')
print(f'min_area:{min_area}')
# 過濾輪廓,將面積小於 min_area_threshold 的輪廓區域設為背景值(0)
for contour in contours:
area = cv2.contourArea(contour)
if area < min_area_threshold:
cv2.drawContours(img, [contour], -1, 0, thickness=cv2.FILLED) #將白點 轉換成黑色
return img
#導入圖片
img1 = cv2.imread('./particle.jpg')
print(f'img1:{img1.shape}')
min_area_threshold = 1000 #設定想濾除的面積
#呼叫filter_contours_by_area函數
result_img = filter_contours_by_area(img1,min_area_threshold)

#因opencv導入圖片為BGR,PLT顯示圖片需要轉換成RGB
result_colored = cv2.cvtColor(result_img, cv2.COLOR_GRAY2BGR)
result_colored = cv2.cvtColor(result_colored, cv2.COLOR_BGR2RGB)

# 顯示原始圖片和結果
plt.subplot(1, 2, 1), plt.imshow(img1), plt.title('Image 1'), plt.axis('off')
plt.subplot(1, 2, 2), plt.imshow(result_colored), plt.title('result_img'), plt.axis('off')
plt.show()

def filter_contours_by_area(img:np.ndarray, min_area_threshold)::定義了一個函數,接受一張圖片img和最小面積閾值min_area_threshold作為參數。

contours, _ = cv2.findContours(img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE):使用cv2.findContours找到圖片中的所有輪廓。這個函數返回輪廓的列表contours

max_contour = max(contours, key=cv2.contourArea)

min_contour = min(contours, key=cv2.contourArea):找到面積最大和最小的輪廓。

print(f'max_area:{max_area}')print(f'min_area:{min_area}'):印出最大和最小輪廓的面積,方便等下設定濾除面積的基準參考值。

for contour in contours::遍歷所有輪廓。

area = cv2.contourArea(contour):計算當前輪廓的面積。

if area < min_area_threshold::如果面積小於指定的最小面積閾值,則將此輪廓的區域設為背景值(0),即將白點轉換為黑色。

cv2.drawContours(img, [contour], -1, 0, thickness=cv2.FILLED)

result_img = filter_contours_by_area(img1, min_area_threshold):呼叫函數,將圖片img1濾除面積小於min_area_threshold的白點,得到result_img

result_colored = cv2.cvtColor(result_img, cv2.COLOR_GRAY2BGR)

result_colored = cv2.cvtColor(result_colored, cv2.COLOR_BGR2RGB)

將結果圖轉換為彩色圖,因為Matplotlib與OPENCV色域不同,OPENCV為BGR的關係。

旋轉圖片

import cv2
import numpy as np
import matplotlib.pyplot as plt

def rotate_image(image, angle):
# 取得影像中心點坐標
center = tuple(np.array(image.shape[1::-1]) / 2)
# 設定旋轉矩陣
rotation_matrix = cv2.getRotationMatrix2D(center, angle, 1.0)
# 進行影像旋轉
rotated_image = cv2.warpAffine(image, rotation_matrix, image.shape[1::-1], flags=cv2.INTER_LINEAR)
return rotated_image

img1 = cv2.imread('./images.jpg')

result_img = rotate_image(img1,90)

#因opencv導入圖片為BGR,PLT顯示圖片需要轉換成RGB
img1 = cv2.cvtColor(img1, cv2.COLOR_BGR2RGB)
result_colored = cv2.cvtColor(result_img, cv2.COLOR_BGR2RGB)

# 顯示原始圖片和結果
plt.subplot(1, 2, 1), plt.imshow(img1), plt.title('Image 1'), plt.axis('off')
plt.subplot(1, 2, 2), plt.imshow(result_colored), plt.title('result_img'), plt.axis('off')
plt.show()
  1. def rotate_image(image, angle)::定義了一個函數,用於旋轉圖片。接受一張圖片image和旋轉角度angle作為參數。
  2. center = tuple(np.array(image.shape[1::-1]) / 2):取得圖片的中心點坐標。
  3. rotation_matrix = cv2.getRotationMatrix2D(center, angle, 1.0):使用cv2.getRotationMatrix2D來獲得旋轉矩陣,其中center是旋轉的中心點,angle是旋轉的角度,1.0是縮放因子。
  4. rotated_image = cv2.warpAffine(image, rotation_matrix, image.shape[1::-1], flags=cv2.INTER_LINEAR):使用cv2.warpAffine進行影像旋轉,flags=cv2.INTER_LINEAR表示使用線性插值。

謝謝大家觀看,若喜歡在麻煩動動小手給點愛心 感謝:)





留言
avatar-img
螃蟹_crab的沙龍
159會員
312內容數
本業是影像辨識軟體開發,閒暇時間進修AI相關內容,將學習到的內容寫成文章分享。 興趣是攝影,踏青,探索未知領域。 人生就是不斷的挑戰及自我認清,希望老了躺在床上不會後悔自己什麼都沒做。
螃蟹_crab的沙龍的其他內容
2025/02/15
在電腦視覺應用中,輪廓(Contour)常用來描述物體的邊界。 當圖像中有雜訊或物體邊緣過於複雜時,我們可以利用輪廓逼近技術,將輪廓簡化成較少點數的多邊形,這不僅有助於後續的形狀分析,也能提高處理速度。 本文將介紹如何使用 OpenCV 中的 cv2.arcLength 與 cv2.approx
Thumbnail
2025/02/15
在電腦視覺應用中,輪廓(Contour)常用來描述物體的邊界。 當圖像中有雜訊或物體邊緣過於複雜時,我們可以利用輪廓逼近技術,將輪廓簡化成較少點數的多邊形,這不僅有助於後續的形狀分析,也能提高處理速度。 本文將介紹如何使用 OpenCV 中的 cv2.arcLength 與 cv2.approx
Thumbnail
2024/12/02
中值濾波器(Adaptive Median Filter)是一種針對噪聲去除的圖像處理技術,主要應用於處理含有椒鹽雜訊的圖像,但在椒鹽雜訊過大時就會面臨,若為了處理掉雜訊,使用的處理窗口(kernel)就要大一點,會造成圖像的邊緣模糊掉。 後面為解決這個問題,就發展了自適應中值濾波器,其概念源自於
Thumbnail
2024/12/02
中值濾波器(Adaptive Median Filter)是一種針對噪聲去除的圖像處理技術,主要應用於處理含有椒鹽雜訊的圖像,但在椒鹽雜訊過大時就會面臨,若為了處理掉雜訊,使用的處理窗口(kernel)就要大一點,會造成圖像的邊緣模糊掉。 後面為解決這個問題,就發展了自適應中值濾波器,其概念源自於
Thumbnail
2024/10/03
在影像處理中,形態學操作是非常重要的一種技術,能夠幫助我們去除噪點、強化特徵、修復物體的形狀等。形態學操作的核心是「結構元素」(kernel),不同形狀的結構元素會產生不同的處理效果。本文將介紹如何使用不同形狀的結構元素來進行圖像處理,並結合實際程式範例和測試圖片來說明其效果。
Thumbnail
2024/10/03
在影像處理中,形態學操作是非常重要的一種技術,能夠幫助我們去除噪點、強化特徵、修復物體的形狀等。形態學操作的核心是「結構元素」(kernel),不同形狀的結構元素會產生不同的處理效果。本文將介紹如何使用不同形狀的結構元素來進行圖像處理,並結合實際程式範例和測試圖片來說明其效果。
Thumbnail
看更多
你可能也想看
Thumbnail
在 vocus 與你一起探索內容、發掘靈感的路上,我們又將啟動新的冒險——vocus App 正式推出! 現在起,你可以在 iOS App Store 下載全新上架的 vocus App。 無論是在通勤路上、日常空檔,或一天結束後的放鬆時刻,都能自在沈浸在內容宇宙中。
Thumbnail
在 vocus 與你一起探索內容、發掘靈感的路上,我們又將啟動新的冒險——vocus App 正式推出! 現在起,你可以在 iOS App Store 下載全新上架的 vocus App。 無論是在通勤路上、日常空檔,或一天結束後的放鬆時刻,都能自在沈浸在內容宇宙中。
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
Thumbnail
呈上篇文章,針對單排的圖像文字增加間隔,但如果文字是雙排呢 [OpenCV][Python]OCR分割及增加間隔[單排文字]
Thumbnail
呈上篇文章,針對單排的圖像文字增加間隔,但如果文字是雙排呢 [OpenCV][Python]OCR分割及增加間隔[單排文字]
Thumbnail
本文將說明如何去辨識出圖片文字​位置及高寬。
Thumbnail
本文將說明如何去辨識出圖片文字​位置及高寬。
Thumbnail
在影像處理中,有時候我們只想特別關注某個感興趣的區域時,就是ROI的概念,擷取此範圍的圖像來做處理。 設定超過圖像邊界時就會報錯,本文主要介紹如何擷取影像的同時,避免設定錯誤造成程式崩潰的狀況。 擷取圖像示意圖 ROI程式範例 import cv2 import numpy as np
Thumbnail
在影像處理中,有時候我們只想特別關注某個感興趣的區域時,就是ROI的概念,擷取此範圍的圖像來做處理。 設定超過圖像邊界時就會報錯,本文主要介紹如何擷取影像的同時,避免設定錯誤造成程式崩潰的狀況。 擷取圖像示意圖 ROI程式範例 import cv2 import numpy as np
Thumbnail
常見的圖像銳利化方法: 銳化濾波器 增強對比度 Unsharp Masking
Thumbnail
常見的圖像銳利化方法: 銳化濾波器 增強對比度 Unsharp Masking
Thumbnail
上一篇提到利用cv2.inRangex,建立遮罩來過濾出紅球。這次我們稍微更動一下程式碼,將紅球變顏色。 [OpenCV][Python]利用cv2.inRange搭配cv2.bitwise_and過濾紅球 結果圖 將紅球改變顏色成藍球
Thumbnail
上一篇提到利用cv2.inRangex,建立遮罩來過濾出紅球。這次我們稍微更動一下程式碼,將紅球變顏色。 [OpenCV][Python]利用cv2.inRange搭配cv2.bitwise_and過濾紅球 結果圖 將紅球改變顏色成藍球
Thumbnail
涉及圖像處理和計算機視覺時,色彩空間轉換是一個常見操作,應用如下: 降維: 將一張彩色圖像轉換為灰度圖像可以減少數據的維度,簡化處理過程,同時在某些情況下保留重要的視覺信息。 突顯特徵: 在某些情況下,某些色彩通道可能包含冗餘或不必要的信息,通過轉換到其他色彩空間,可以更好地突顯圖像中的重要特徵
Thumbnail
涉及圖像處理和計算機視覺時,色彩空間轉換是一個常見操作,應用如下: 降維: 將一張彩色圖像轉換為灰度圖像可以減少數據的維度,簡化處理過程,同時在某些情況下保留重要的視覺信息。 突顯特徵: 在某些情況下,某些色彩通道可能包含冗餘或不必要的信息,通過轉換到其他色彩空間,可以更好地突顯圖像中的重要特徵
Thumbnail
形態學操作在影像處理中有多種應用,特別是在處理二值化影像(黑白影像)。 在影像處理應用上,基本上都由侵蝕,膨脹這兩種方法,組合搭配而成。 常見應用場景 物體檢測與分割: 形態學操作可以用於增強或改善二值化影像中的物體邊界,使得物體的檢測和分割更加準確。
Thumbnail
形態學操作在影像處理中有多種應用,特別是在處理二值化影像(黑白影像)。 在影像處理應用上,基本上都由侵蝕,膨脹這兩種方法,組合搭配而成。 常見應用場景 物體檢測與分割: 形態學操作可以用於增強或改善二值化影像中的物體邊界,使得物體的檢測和分割更加準確。
Thumbnail
本文將介紹影像的基本操作包括:影像的讀取、顯示、保存,以及一些常見的操作如裁剪、旋轉、縮放等。 語法介紹 讀取影像: cv2.imread函數的參數是影像的檔案路徑。讀取後的影像以NumPy的ndarray形式表示。
Thumbnail
本文將介紹影像的基本操作包括:影像的讀取、顯示、保存,以及一些常見的操作如裁剪、旋轉、縮放等。 語法介紹 讀取影像: cv2.imread函數的參數是影像的檔案路徑。讀取後的影像以NumPy的ndarray形式表示。
Thumbnail
OpenCV(Open Source Computer Vision Library)是一個開源的計算機視覺和影像處理庫,它提供了豐富的功能和工具,可用於開發各種視覺應用程式。 OpenCV最初是用C++編寫的,但它也提供了Python、Java等多種程式語言的接口,方便不同語言的開發者使用。
Thumbnail
OpenCV(Open Source Computer Vision Library)是一個開源的計算機視覺和影像處理庫,它提供了豐富的功能和工具,可用於開發各種視覺應用程式。 OpenCV最初是用C++編寫的,但它也提供了Python、Java等多種程式語言的接口,方便不同語言的開發者使用。
Thumbnail
[影像處理_OpenCV Python]使用Python撰寫影像處理功能,圖片遮罩或濾除掉不要的地方,旋轉圖片 以下範例將呈現影像處理三種不同的應用: 遮罩的實現 濾除 旋轉
Thumbnail
[影像處理_OpenCV Python]使用Python撰寫影像處理功能,圖片遮罩或濾除掉不要的地方,旋轉圖片 以下範例將呈現影像處理三種不同的應用: 遮罩的實現 濾除 旋轉
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News