medical_balloon/Dimensional_Inspection/size_0522.py
leo890808 a1fb25c89f UP
2024-07-30 16:18:26 +08:00

106 lines
3.9 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import cv2
import numpy as np
class ImageProcessor:
def __init__(self, image_path):
# 讀取圖像
self.original_image = cv2.imread(image_path)
self.process_image()
def process_image(self):
# 複製原始圖像
img = self.original_image.copy()
o_img_black = img.copy()
o_img_black[:, :, :] = 0
# 將圖像轉換為灰度圖
gray_image = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 使用 Canny 邊緣檢測
edges = cv2.Canny(gray_image, 250, 250)
# 檢測直線
lines = cv2.HoughLinesP(edges, 1, np.pi / 180, threshold=100, minLineLength=100, maxLineGap=200)
# 初始化黑色圖像
black_img = gray_image.copy()
black_img[:, :] = 0
if lines is not None:
for line in lines:
x1, y1, x2, y2 = line[0]
cv2.line(black_img, (x1, y1), (x2, y2), (255, 255, 0), 2)
# 繪製紅色的兩條線
cv2.line(o_img_black, (300, 0), (300, len(o_img_black)), (0, 0, 255), 2)
cv2.line(o_img_black, (len(o_img_black[0]) - 300, 0), (len(o_img_black[0]) - 300, len(o_img_black)), (0, 0, 255), 2)
# 找到黑色圖像中白色255的像素
y_list, x_list = np.where(black_img == 255)
# 像素大小5.5um
pixel_size_um = 5.5
# 計算直徑
self.calculate_diameter(300, x_list, y_list, pixel_size_um)
self.calculate_diameter(o_img_black.shape[1] - 300, x_list, y_list, pixel_size_um)
# 計算角度並找到負角度的最小值和正角度的最大值
self.calculate_angles(lines)
# 標記相交點
self.mark_intersection_points(o_img_black, x_list, y_list, 300, o_img_black.shape[1] - 300)
# 顯示結果
self.display_image(o_img_black)
def calculate_diameter(self, x_value, x_list, y_list, pixel_size_um):
indices = np.where(x_list == x_value)[0]
y_values = y_list[indices]
max_y = np.max(y_values)
min_y = np.min(y_values)
diff = max_y - min_y
diameter = diff * pixel_size_um / 1000
print(f"直徑: Ø{diameter:.3f} mm")
def calculate_angles(self, lines):
min_negative_angle = float('inf')
max_positive_angle = float('-inf')
if lines is not None:
for line in lines:
x1, y1, x2, y2 = line[0]
angle = np.arctan2(y2 - y1, x2 - x1) * 180.0 / np.pi
if angle < 0:
min_negative_angle = min(min_negative_angle, angle)
elif angle > 0:
max_positive_angle = max(max_positive_angle, angle)
if min_negative_angle != float('inf') and max_positive_angle != float('-inf'):
min_negative_angle_abs = abs(min_negative_angle)
angle_sum = min_negative_angle_abs + max_positive_angle
print(f"角度為: {angle_sum:.2f} °")
def mark_intersection_points(self, img, x_list, y_list, x_value1, x_value2):
indices_1 = np.where(x_list == x_value1)[0]
indices_2 = np.where(x_list == x_value2)[0]
intersection_points_1 = [(x_value1, y_list[i]) for i in indices_1]
intersection_points_2 = [(x_value2, y_list[i]) for i in indices_2]
intersection_points = intersection_points_1 + intersection_points_2
for point in intersection_points:
cv2.circle(img, point, 10, (255, 0, 0), -1)
for i in range(len(x_list)):
point = (x_list[i], y_list[i])
cv2.circle(img, point, 1, (0, 255, 0), -1)
def display_image(self, img):
resized_img = cv2.resize(img, (1080, 1080))
cv2.imshow('Processed Image', resized_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
if __name__ == "__main__":
image_path = r'D:\Code\Project\Medeologix\Python\Size\01_10fps_0.041ms_0db_1092\01.bmp'
processor = ImageProcessor(image_path)