[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
128會員
217內容數
本業是影像辨識軟體開發,閒暇時間進修AI相關內容,將學習到的內容寫成文章分享。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
你可能也想看
Google News 追蹤
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
使用 LBP(Local Binary Patterns) 進行紋理分析和瑕疵檢測 Local Binary Patterns(LBP) 是一種用來描述圖像紋理的特徵提取技術。LBP 對於檢測表面紋理的異常具有很好的效果,尤其在檢測紋理一致的材料表面(例如紡織品、紙張、金屬)時,LBP 非常有用。
Thumbnail
Python資料視覺化在數據分析中扮演關鍵角色,透過視覺化捕捉數據模式、趨勢和異常,透過Matplotlib等工具創建專業圖表變相對簡單和高效。
Thumbnail
本篇內容介紹如何使用 Python中的 moviepy library 簡單的剪影片。 先安裝moviepy library , 用pip install moviepy , 可參考官方文件。 要剪的影片和python檔要在同個資料夾中,若不在同個位置要用 os library 更換路徑
Thumbnail
本文在介紹如何用Python繪製各點大小不同的散布圖及用箭頭標註特殊點
Thumbnail
本篇文章主要講述cv2.connectedComponent應用於物件上的分割,將不同文字分割並用不同顏色標記。 範例程式結果圖 cv2.connectedComponentsWithStats 是 OpenCV 中用來執行連通元件標記的函式之一。
Thumbnail
伽瑪校正(Gamma correction)被視為影像增強的一種方法之一。 通過調整 gamma 值,可以改變圖像的亮度和對比度,從而使圖像更清晰或更具有視覺效果。 以下將利用cv2.LUT及numpy的組合實現伽瑪校正,及詳細介紹cv2.LUT 函式應用。
Thumbnail
介紹OpenCV中的cv2.matchTemplate和cv2.minMaxLoc函數的使用方法和參數,提供程式範例以及相關特徵匹配的詳細介紹,讓讀者對此有更深入的瞭解。
Thumbnail
瞭解二值化影像的應用和程式語法,包括物體檢測和分割、邊緣檢測、圖像分析和測量、文檔辨識,以及使用cv2.threshold的參數和程式範例。
Thumbnail
下面使用一些關鍵字,來看看是否能嘗試控制鏡頭角度。不過,請注意,Stable Diffusion 派的 AI 生圖系統能否看懂提示詞?能看懂多少?是要看模型的,所以...
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
使用 LBP(Local Binary Patterns) 進行紋理分析和瑕疵檢測 Local Binary Patterns(LBP) 是一種用來描述圖像紋理的特徵提取技術。LBP 對於檢測表面紋理的異常具有很好的效果,尤其在檢測紋理一致的材料表面(例如紡織品、紙張、金屬)時,LBP 非常有用。
Thumbnail
Python資料視覺化在數據分析中扮演關鍵角色,透過視覺化捕捉數據模式、趨勢和異常,透過Matplotlib等工具創建專業圖表變相對簡單和高效。
Thumbnail
本篇內容介紹如何使用 Python中的 moviepy library 簡單的剪影片。 先安裝moviepy library , 用pip install moviepy , 可參考官方文件。 要剪的影片和python檔要在同個資料夾中,若不在同個位置要用 os library 更換路徑
Thumbnail
本文在介紹如何用Python繪製各點大小不同的散布圖及用箭頭標註特殊點
Thumbnail
本篇文章主要講述cv2.connectedComponent應用於物件上的分割,將不同文字分割並用不同顏色標記。 範例程式結果圖 cv2.connectedComponentsWithStats 是 OpenCV 中用來執行連通元件標記的函式之一。
Thumbnail
伽瑪校正(Gamma correction)被視為影像增強的一種方法之一。 通過調整 gamma 值,可以改變圖像的亮度和對比度,從而使圖像更清晰或更具有視覺效果。 以下將利用cv2.LUT及numpy的組合實現伽瑪校正,及詳細介紹cv2.LUT 函式應用。
Thumbnail
介紹OpenCV中的cv2.matchTemplate和cv2.minMaxLoc函數的使用方法和參數,提供程式範例以及相關特徵匹配的詳細介紹,讓讀者對此有更深入的瞭解。
Thumbnail
瞭解二值化影像的應用和程式語法,包括物體檢測和分割、邊緣檢測、圖像分析和測量、文檔辨識,以及使用cv2.threshold的參數和程式範例。
Thumbnail
下面使用一些關鍵字,來看看是否能嘗試控制鏡頭角度。不過,請注意,Stable Diffusion 派的 AI 生圖系統能否看懂提示詞?能看懂多少?是要看模型的,所以...