對焦取框演算法

cupwym發表於2024-03-25
 1 import cv2
 2 import numpy as np
 3 
 4 # 讀取原始影像
 5 original_image = cv2.imread('train16.png')
 6 
 7 # 高斯模糊處理
 8 blurred_image = cv2.GaussianBlur(original_image, (5, 5), 0)
 9 
10 # 計算新影像
11 new_image = cv2.subtract(original_image, blurred_image)
12 
13 # 轉換新影像為灰度圖
14 gray_new_image = cv2.cvtColor(new_image, cv2.COLOR_BGR2GRAY)
15 
16 # 計算影像的形狀
17 M, N = gray_new_image.shape
18 
19 # 計算新影像的灰度加權質心
20 sum_intensity = np.sum(gray_new_image)
21 
22 # 計算加權和
23 sum_x = 0.0
24 sum_y = 0.0
25 
26 for y in range(M):
27     for x in range(N):   
28         sum_x += x * gray_new_image[y, x]
29         sum_y += y * gray_new_image[y, x]
30 
31 x_c = int(sum_x / sum_intensity)
32 y_c = int(sum_y / sum_intensity)
33 
34 # 設定框的大小引數
35 box_scale = 0.45  # 框相對於影像大小的比例
36 
37 # 計算框的大小
38 box_width = int(N * box_scale)
39 box_height = int(M * box_scale)
40 
41 # 計算框的左上角和右下角座標
42 x1 = max(0, x_c - box_width // 2)
43 y1 = max(0, y_c - box_height // 2)
44 x2 = min(N, x_c + box_width // 2)
45 y2 = min(M, y_c + box_height // 2)
46 
47 # 在原始影像上同時標註質心和框
48 image_with_center_and_box = original_image.copy()
49 image_with_center_and_box = cv2.circle(image_with_center_and_box, (x_c, y_c), 5, (255, 0, 0), -1)# 在質心位置畫一個藍色實心圓
50 image_with_center_and_box = cv2.rectangle(image_with_center_and_box, (x1, y1), (x2, y2), (0, 255, 0), 2)  # 在框的位置畫一個綠色矩形

對輸入的影像進行高斯模糊處理,計算出新影像後,找到影像的灰度加權質心,並在該質心周圍繪製一個矩形框,用於標記影像中的重要區域。《

Analysis and comparison of automatic image focusing algorithms in digital
image processing

blurred_image = cv2.GaussianBlur(original_image, (5, 5), 0): 對原始影像進行高斯模糊處理,使用5x5的核心大小。

new_image = cv2.subtract(original_image, blurred_image): 計算原始影像與模糊影像的差異,得到新的影像。

gray_new_image = cv2.cvtColor(new_image, cv2.COLOR_BGR2GRAY): 將新影像轉換為灰度影像,方便後續處理。

獲取影像的形狀資訊:

M, N = gray_new_image.shape: 獲取灰度影像的高度和寬度。

計算新影像的灰度加權質心:

遍歷影像的每個畫素,計算加權和以及加權質心的座標。

計算框的大小和位置:

box_scale = 0.45: 設定框相對於影像大小的比例。
根據加權質心的座標和比例計算框的大小。
計算框的左上角和右下角座標,確保框在影像範圍內。

相關文章