[Python][OpenCV]防止擷取圖像時超過範圍報錯

更新於 發佈於 閱讀時間約 4 分鐘

在影像處理中,有時候我們只想特別關注某個感興趣的區域時,就是ROI的概念,擷取此範圍的圖像來做處理。

設定超過圖像邊界時就會報錯,本文主要介紹如何擷取影像的同時,避免設定錯誤造成程式崩潰的狀況。


擷取圖像示意圖

raw-image


ROI程式範例

import cv2
import numpy as np

img = cv2.imread(f'圖片路徑')

# 擷取範圍
y = 200
x = 200
h = 200
w = 200
y_ = y + h
x_ = x + w
#擷取圖片
roi = img[y:y_, x:x_]
#顯示圖片
cv2.imshow('roi',roi)
cv2.waitKey(0)
cv2.destroyAllWindows()

當X或Y設定超過原先圖片邊界時就會報錯。

先印出圖片大小,故意設定超過圖像邊界,圖像高度420,Y設定超過420就會報錯

img_h, img_w = img.shape[:2]
print(f'img_h : {img_h}, img_w: {img_w}')

# 擷取範圍
y = 440
x = 200
h = 200
w = 200
y_ = y + h
x_ = x + w
raw-image

如何避免超過邊界報錯

在第17,18加入了偵測的功能,限制Y與X輸出的範圍,即使Y輸入,他也會限制其範圍將數值鎖定在圖片高度-1的況狀下,也就是419,我們把Y印出就會是419這數值。

import cv2
import numpy as np

img = cv2.imread(f'圖片路徑')
img_h, img_w = img.shape[:2]
print(f'img_h : {img_h}, img_w: {img_w}')

# 擷取範圍
y = 440
x = 200
h = 200
w = 200
y_ = y + h
x_ = x + w

# 避免超過範圍變成空的
y = min(max(y, 0), img_h - 1)
x = min(max(x, 0), img_w - 1)
print(f'y : {y}')
print(f'x : {x}')

# 擷取圖片
roi = img[y:y_, x:x_]

# 顯示圖片
cv2.imshow('roi',roi)
cv2.waitKey(0)
cv2.destroyAllWindows()
raw-image

關鍵語法說明

y = min(max(y, 0), img_h - 1)

詳細說明

  1. max(y, 0)
    • 這部分確保 y 的值至少是 0。如果 y 的值小於 0,則取 0,否則取 y。
    • 換句話說,這是用來防止 y 的值變得太小(負數)。
    • 示例:pythonCopy codey = -5 max(y, 0) # 结果是 0 y = 10 max(y, 0) # 结果是 10
  2. min(..., img_h - 1)
    • 這部分確保 y 的值不超過 img_h - 1。img_h 是圖像的高度,img_h - 1 是圖像中最後一行的索引。
    • 換句話說,這是用來防止 y 的值超出圖像的範圍。

結合起來的效果

這兩個操作結合起來,確保 y 的值始終在 0img_h - 1 之間:

  • 如果 y 小於 0,結果是 0
  • 如果 y 大於或等於 img_h,結果是 img_h - 1
  • 如果 y0img_h - 1 之間,結果就是 y 本身。

範例

假設圖像的高度為 100

img_h = 100

y = -10
y = min(max(y, 0), img_h - 1) # y 變為 0

y = 50
y = min(max(y, 0), img_h - 1) # y 保持 50

y = 120
y = min(max(y, 0), img_h - 1) # y 變為 99

用途

這種做法在圖像處理中非常常見,用來確保像素索引不超出圖像的邊界,防止程式崩潰或引發錯誤。

avatar-img
134會員
222內容數
本業是影像辨識軟體開發,閒暇時間進修AI相關內容,將學習到的內容寫成文章分享。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
螃蟹_crab的沙龍 的其他內容
在某些特殊情況下,需要將圖片進行黑白反轉,例如Tesseract(OCR辨識引擎)就有建議黑底白字的狀況下辨識率較高。 本文將使用 NumPy 進行影像黑白反轉,並顯示反轉前後的影像。
在影像辨識中,若遇到物件與背景難以分辨的狀況下,先做一下色彩分析,知道了色彩強度階層上的像素數,有助於了解後續需要做什麼處理,比較好分割出辨識物。 若想辨識的物件與背景的RGB值過於接近,也比較好說明此狀況,為什麼較難分割出物件。 成果呈現 第一張圖:左邊為原圖,右邊為分析結果的圖,用其他顏
接續上一邊,分割了螺絲與螺母的圖像,但分割後的結果,因為螺絲過於接近的關係,沒有切割乾淨,會有其他螺絲的頭或者身體,這樣會影響到後續量測。 [OpenCV應用][Python]擷取出螺絲或螺母的影像 本文主要是,如何去除掉不要的背景雜物。 下層為原先分割的圖,上層為去除背景雜物的圖。
此篇為上一篇文章的延伸,先辦別是螺絲還是螺母才擷取出影像。 [OpenCV應用][Python]利用findContours辨識螺絲還是螺母 因為可能會需要另外處理螺絲與螺母才可以準確地去做量測,所以第一步就是先分割出這兩種的圖像。
先上成果圖,如果是螺母的話就標註 is circle來區分。 簡單的用圖表加文字說明AOI辨識 在此文章的範例中: 影像前處理:色彩空間轉換(灰階) -> 二值化閥值處理 演算法:尋找輪廓 數值判斷:長,寬,面積,周長 圖片來源 程式碼 import cv2 import nu
常見的圖像銳利化方法: 銳化濾波器 增強對比度 Unsharp Masking
在某些特殊情況下,需要將圖片進行黑白反轉,例如Tesseract(OCR辨識引擎)就有建議黑底白字的狀況下辨識率較高。 本文將使用 NumPy 進行影像黑白反轉,並顯示反轉前後的影像。
在影像辨識中,若遇到物件與背景難以分辨的狀況下,先做一下色彩分析,知道了色彩強度階層上的像素數,有助於了解後續需要做什麼處理,比較好分割出辨識物。 若想辨識的物件與背景的RGB值過於接近,也比較好說明此狀況,為什麼較難分割出物件。 成果呈現 第一張圖:左邊為原圖,右邊為分析結果的圖,用其他顏
接續上一邊,分割了螺絲與螺母的圖像,但分割後的結果,因為螺絲過於接近的關係,沒有切割乾淨,會有其他螺絲的頭或者身體,這樣會影響到後續量測。 [OpenCV應用][Python]擷取出螺絲或螺母的影像 本文主要是,如何去除掉不要的背景雜物。 下層為原先分割的圖,上層為去除背景雜物的圖。
此篇為上一篇文章的延伸,先辦別是螺絲還是螺母才擷取出影像。 [OpenCV應用][Python]利用findContours辨識螺絲還是螺母 因為可能會需要另外處理螺絲與螺母才可以準確地去做量測,所以第一步就是先分割出這兩種的圖像。
先上成果圖,如果是螺母的話就標註 is circle來區分。 簡單的用圖表加文字說明AOI辨識 在此文章的範例中: 影像前處理:色彩空間轉換(灰階) -> 二值化閥值處理 演算法:尋找輪廓 數值判斷:長,寬,面積,周長 圖片來源 程式碼 import cv2 import nu
常見的圖像銳利化方法: 銳化濾波器 增強對比度 Unsharp Masking
你可能也想看
Google News 追蹤
Thumbnail
Python資料視覺化在數據分析中扮演關鍵角色,透過視覺化捕捉數據模式、趨勢和異常,透過Matplotlib等工具創建專業圖表變相對簡單和高效。
Thumbnail
前言 讀了許多理論,是時候實際動手做做看了,以下是我的模型訓練初體驗,有點糟就是了XD。 正文 def conv(filters, kernel_size, strides=1): return Conv2D(filters, kernel_size,
Thumbnail
攝影構圖會影響畫面的視覺平衡和觀感,像是運用三分法則等技法,能夠精準地引導觀眾的視線,使畫面更加動人。
Thumbnail
本文在介紹如何用Python繪製各點大小不同的散布圖及用箭頭標註特殊點
Thumbnail
人工智慧技術為攝影帶來新創意和可能性,透過不同鏡頭景深,呈現多樣化風格和視覺效果。本文介紹遠景、全景、中景、近景、特寫和廣角等不同攝影拍攝技巧。
Thumbnail
寬景Wide view 鳥瞰Bird view 前景Foreground 背景Background 正面Front View 側面Side View 俯視Top View 景深Depth of field 微距鏡頭Macro Shot 超特寫Extreme Close up
Thumbnail
當我們在進行影像處理時, 在Python的世界最常聽到的就是OpenCV, 而我們在處理影片時也會想要僅針對某時間段的影片進行處理, 今天我們就來教您如何透過OpenCV來讀取特定的時間區段。 在進入主題之前, 有一些基本概念務必先行建立, 一個影片是由多張圖片組成的, 因此最小單元為一張圖
Thumbnail
點陣圖 點陣圖是由許多方格像素組成的圖片, 因此我們常常在將圖片放大時會呈現像是馬賽克的狀況, 假設期望圖片越清晰那所需要的像素會較多個, 因此空間耗用量也相對較大。 常見的格式有: .JPG .PNG .GIF .BMP .TIFF等格式。 繪製程式碼: 向量圖 向量
Thumbnail
下面使用一些關鍵字,來看看是否能嘗試控制鏡頭角度。不過,請注意,Stable Diffusion 派的 AI 生圖系統能否看懂提示詞?能看懂多少?是要看模型的,所以...
Thumbnail
Python資料視覺化在數據分析中扮演關鍵角色,透過視覺化捕捉數據模式、趨勢和異常,透過Matplotlib等工具創建專業圖表變相對簡單和高效。
Thumbnail
前言 讀了許多理論,是時候實際動手做做看了,以下是我的模型訓練初體驗,有點糟就是了XD。 正文 def conv(filters, kernel_size, strides=1): return Conv2D(filters, kernel_size,
Thumbnail
攝影構圖會影響畫面的視覺平衡和觀感,像是運用三分法則等技法,能夠精準地引導觀眾的視線,使畫面更加動人。
Thumbnail
本文在介紹如何用Python繪製各點大小不同的散布圖及用箭頭標註特殊點
Thumbnail
人工智慧技術為攝影帶來新創意和可能性,透過不同鏡頭景深,呈現多樣化風格和視覺效果。本文介紹遠景、全景、中景、近景、特寫和廣角等不同攝影拍攝技巧。
Thumbnail
寬景Wide view 鳥瞰Bird view 前景Foreground 背景Background 正面Front View 側面Side View 俯視Top View 景深Depth of field 微距鏡頭Macro Shot 超特寫Extreme Close up
Thumbnail
當我們在進行影像處理時, 在Python的世界最常聽到的就是OpenCV, 而我們在處理影片時也會想要僅針對某時間段的影片進行處理, 今天我們就來教您如何透過OpenCV來讀取特定的時間區段。 在進入主題之前, 有一些基本概念務必先行建立, 一個影片是由多張圖片組成的, 因此最小單元為一張圖
Thumbnail
點陣圖 點陣圖是由許多方格像素組成的圖片, 因此我們常常在將圖片放大時會呈現像是馬賽克的狀況, 假設期望圖片越清晰那所需要的像素會較多個, 因此空間耗用量也相對較大。 常見的格式有: .JPG .PNG .GIF .BMP .TIFF等格式。 繪製程式碼: 向量圖 向量
Thumbnail
下面使用一些關鍵字,來看看是否能嘗試控制鏡頭角度。不過,請注意,Stable Diffusion 派的 AI 生圖系統能否看懂提示詞?能看懂多少?是要看模型的,所以...