跳到主要內容

初探 OpenCV 圖像處理

 前言

OpenCV的全稱是Open Source Computer Vision Library,是一個跨平台的電腦視覺庫。OpenCV是由英特爾公司發起並參與開發,以BSD授權條款授權發行,可以在商業和研究領域中免費使用。OpenCV可用於開發即時的圖像處理、電腦視覺以及模式辨識程式。2011年起,OpenCV開始支援GPU即時加速運算。OpenCV 支援多種程式語言,例如 C++、Python、Java 等,並可在 Windows、Linux、OS X、Android 和 iOS 等不同平台上運作。


安裝 OpenCV

%pip3 install opencv-python


實作範例:


1 - 使用 OpenCV 讀取和顯示影像

從文件中讀取圖像並將其顯示在視窗中。


import cv2


# 從檔案中讀取影像

image = cv2.imread('duck.jpg')


# 開啟一個視窗來顯示影像.第一個參數是視窗標題,第二個參數是要顯示的圖像

cv2.imshow('Original Image', image)


# 按下任意鍵則關閉所有視窗

cv2.waitKey(0)  # cv2.waitKey(0)等待按鍵

# cv2.destroyAllWindows()關閉視窗

cv2.destroyAllWindows()



















2 - 使用 OpenCV 裁切影像

裁剪影像可以擷取影像的一部分進行進一步處理或分析.OpenCV 利用影像切片功能,可以輕鬆實現裁剪.


import cv2


# 讀取圖片

image = cv2.imread('duck.jpg')


try:

    # 顯示原始圖片

    cv2.imshow('Original Image', image)

except Exception as e:

    print(f"顯示影像時出錯: {e}")


x = 120

y = 100

w = 300

h = 280


# OpenCV 將影象儲存為 NumPy 陣列,透過切片陣列來實現裁剪,取出想要的範圍,另存成新的圖片

# 從 100 到 380 選擇畫素行和從 120 到 420 的列,從而產生 280x300 的裁剪影象

cropped_image = image[y:y+h, x:x+w] # 取出陣列的範圍


# 使用cv2.imshow()函式顯示裁剪後的圖片

cv2.imshow('Cropped Image', cropped_image)


# 按下任意鍵則關閉所有視窗

# cv2.waitKey(0)等待按鍵

cv2.waitKey(0)

# cv2.destroyAllWindows()關閉視窗

cv2.destroyAllWindows()

注意:OpenCV的圖片是以BGR格式儲存的,所以切片的範圍是[y:y+h, x:x+w],而不是[x:x+w, y:y+h]



3 - 使用 OpenCV 調整影像大小

處理影像時,調整影像大小非常重要,尤其是在建立縮圖或調整影像尺寸以進行後續分析時. OpenCV 可讓您透過縮放影像的寬度和高度來調整影像大小.


import cv2


# 讀取圖片

image = cv2.imread('duck.jpg')

try:

    # 顯示原始圖片

    cv2.imshow('Original Image', image)

except Exception as e:

    print(f"顯示影像時出錯: {e}")


# 使用cv2.resize()函式來調整圖片大小,fx和fy分別是水平和垂直方向的縮放因子,這裡將圖片縮小為原來的一半

resized_image = cv2.resize(image, (0, 0), fx=0.5, fy=0.5)


# 顯示裁剪後的圖片

cv2.imshow('Resized Image', resized_image)


# 按下任意鍵則關閉所有視窗

cv2.waitKey(0)  # cv2.waitKey(0)等待按鍵

# cv2.destroyAllWindows()關閉視窗

cv2.destroyAllWindows()


4 - 使用 OpenCV 調整影像大小

處理完影像後,您可以儲存輸出結果以供將來使用. OpenCV 的 cv2.imwrite() 函數讓保存映像變得非常簡單.


import cv2


# 讀取圖片

image = cv2.imread('duck.jpg')

resized_image = cv2.resize(image, (0, 0), fx=0.5, fy=0.5)

# 將影像儲存到指定的檔案路徑

cv2.imwrite('resized_image.jpg', resized_image)


print('圖片已成功儲存為 resized_image.jpg')




留言

這個網誌中的熱門文章

初探 Vue 呼叫 API 出現 CORS 跨來源資源共享 問題原因

提要:   在 {初探Vue 與 Spring boot 的對話} 專案 ,前端 Vue 應用程式 串接 後端 API 伺服器 ,axios 呼叫 API 時出現以下,”無法取得回應內容 (No 'Access-Control-Allow-Origin' header is present on the requested resource):” 錯誤訊息,根據查找相關資料 ,出現以下原因。 瀏覽器開發工具 錯誤訊息 畫面 錯誤原因: “ Access to XMLHttpRequest at ” from origin ‘http://localhost:8080’ has been blocked by CORS policy: No ‘Access-Control-Allow-Origin’ header is present on the requested resource” 瀏覽器為了安全考量,實施了同源政策。 當您的前端應用程式 (http://localhost:8080) 嘗試呼叫一個不同來源 (不同協議、不同域名或不同埠號) 的 API 伺服器 (http://localhost:8088) 時,瀏覽器會主動阻止這個請求,除非伺服器明確地允許這個跨來源的存取。 同源政策限制(Same-Origin Policy): 同源政策限制了程式碼和不同網域資源間的互動,同源是指兩份網頁具備相同協定、埠號(如果有指定)以及主機位置 範例: 表列哪些 URL 與 URL http://www.example.com/api/p1 屬於同源: URL                                                   | 結果   | 原因 --------------------------------------------------------------------- http://www.example.com/api/p2     |...

初探 Vue 與 Spring boot 的對話之Frontend (Vue-Frontend)

  Front-end Vue 使用 REST API 建立 Vite 專案 可參考 { Vue 3 初探}  文章 danny@Danny-Yu projects % npm create vite@latest Need to install the following packages: create-vite@8.2.0 Ok to proceed? (y) y > npx > "create-vite" │ ◇   Project name: │   vue-frontend │ ◇   Select a framework: │   Vue │ ◇   Select a variant: │   TypeScript │ ◇   Use rolldown-vite (Experimental)?: │   No │ ◇   Install with npm and start now? │   Yes │ ◇   Scaffolding project in /Users/danny/Desktop/projects/vue-frontend... │ ◇   Installing dependencies with npm... added 47 packages, and audited 48 packages in 27s 6 packages are looking for funding   run `npm fund` for details found 0 vulnerabilities │ ◇   Starting dev server... > vue-frontend@0.0.0 dev > vite   VITE v7.2.4   ready in 411 ms   ➜   Local:   http://localhost:5173/   ➜   Network: use --host to expose   ➜   press h + enter to show...

初探 Spring 中的循環依賴

原因: 當兩個或多個 bean 直接或間接地相互依賴時, 就會出現 Circular Dependency (循環依賴) 如: Bean A -> Bean B -> Bean A import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component public class BeanA {          @Autowired     private BeanB beanB;     public String sayHi() {         return "Hi! 我是 Class A.";     } } import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component public class BeanB {          @Autowired     private BeanA beanA;     public String sayHi() {         return "Hi! 我是 Class B.";     } } 編譯時不會出現問題 danny@Danny-Yu demo % mvn clean install -Dmaven.test.skip=true                           ... ... [INFO] Installing /Users/danny/Desktop/projects/demo/target/dem...