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

109 lines
4.0 KiB
Python
Raw 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 matplotlib.pyplot as plt
import os
def plot_histogram_and_draw_lines(image_path, column_indices, y_range, results, image_index):
# 讀取圖像
image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
# 檢查圖像是否成功讀取
if image is None:
print(f"Error: Unable to read the image '{image_path}'.")
return
# 創建彩色圖像以便畫線
image_color = cv2.cvtColor(image, cv2.COLOR_GRAY2BGR)
for column_index in column_indices:
# 檢查 column_index 是否在圖像範圍內
if column_index >= image.shape[1]:
continue
# 檢查 y_range 是否在圖像範圍內
if max(y_range) >= image.shape[0]:
continue
# 選擇特定的列和 y 坐標範圍
column_data = image[y_range, column_index]
# 反轉 y 坐標範圍
y_coordinates_reversed = list(y_range)[::-1]
# 查找從灰度值 250 開始並遵循規則的最高點
start_index = next((i for i, value in enumerate(column_data) if value <= 250), None)
if start_index is None:
continue
start_y_coord = y_coordinates_reversed[start_index]
decreasing = True
highest_point = None
potential_highest = None
for i in range(start_index, len(column_data) - 40):
current_value = column_data[i]
next_values = column_data[i + 1:i + 5]
if decreasing:
if all(next_value > current_value for next_value in next_values):
decreasing = False
potential_highest = (y_coordinates_reversed[i + 3], column_data[i + 3])
else:
if all(next_value > potential_highest[1] for next_value in next_values):
potential_highest = (y_coordinates_reversed[i + 2], column_data[i + 2])
elif all(next_value < current_value for next_value in next_values):
highest_point = potential_highest
break
if highest_point:
highest_y_coord, highest_grayscale_value = highest_point
# 計算Y坐標的差值
y_difference = start_y_coord - highest_y_coord
# 計算Y坐標差值乘以2.4/1000的結果
result = y_difference * 2.4 / 1000
# 在圖像上畫線,從起點畫到最高點
cv2.line(image_color, (column_index, image.shape[0] - start_y_coord),
(column_index, image.shape[0] - highest_y_coord), (0, 0, 255), 1)
# 保存結果值和圖號到列表
results.append((image_index, result))
# 顯示並保存帶有畫線的圖像
plt.imshow(cv2.cvtColor(image_color, cv2.COLOR_BGR2RGB).transpose(1, 0, 2)) # 轉置圖像
plt.title('Image with lines')
plt.show()
# 獲取輸出圖像的文件名和路徑
base_filename = os.path.splitext(os.path.basename(image_path))[0]
output_filename = f'{base_filename}.png'
output_path = os.path.join(os.path.dirname(image_path), output_filename)
cv2.imwrite(output_path, image_color)
def process_folder(folder_path, column_indices, y_range):
all_results = []
image_index = 0
for filename in os.listdir(folder_path):
if filename.endswith(('.bmp', '.png', '.jpg', '.jpeg')):
image_path = os.path.join(folder_path, filename)
plot_histogram_and_draw_lines(image_path, column_indices, y_range, all_results, image_index)
image_index += 1
# 打印所有結果值每10個空一行
for i, (image_index, result) in enumerate(all_results, start=1):
print(f'Image {image_index + 1}: Result: {result:.4f}')
if i % 10 == 0:
print() # 插入空行
if __name__ == '__main__':
folder_path = r"D:\Code\Project\Medeologix\Python\Size\TIS_test\joe\1092"
x_range = 5472
num_segments = 10
column_indices = [x * x_range // num_segments for x in range(num_segments)]
y_range_partial = range(0, 3648) # 嘗試不同的範圍
process_folder(folder_path, column_indices, y_range_partial)