import cv2
import numpy as npdef calculate_overlap_percentage(a_image_path, b_image_path):# 讀取A組和B組圖像a_image = cv2.imread(a_image_path)b_image = cv2.imread(b_image_path)# 將圖像從BGR轉為HSV色彩空間,便于顏色篩選a_hsv = cv2.cvtColor(a_image, cv2.COLOR_BGR2HSV)b_hsv = cv2.cvtColor(b_image, cv2.COLOR_BGR2HSV)# 設置B組紅色的HSV范圍lower_red = np.array([0, 100, 100])upper_red = np.array([10, 255, 255])# 提取B組紅色區域的掩膜b_red_mask = cv2.inRange(b_hsv, lower_red, upper_red)# 設置A組顏色區域的HSV范圍(棕色和綠色)# 棕色的HSV范圍lower_brown = np.array([10, 30, 30])upper_brown = np.array([25, 255, 200])# 綠色的HSV范圍lower_green = np.array([35, 50, 50])upper_green = np.array([85, 255, 255])# 提取A組棕色和綠色區域的掩膜a_brown_mask = cv2.inRange(a_hsv, lower_brown, upper_brown)a_green_mask = cv2.inRange(a_hsv, lower_green, upper_green)# 合并A組的棕色和綠色區域掩膜a_color_mask = cv2.bitwise_or(a_brown_mask, a_green_mask)# 計算B組紅色區域的像素數量b_red_area = cv2.countNonZero(b_red_mask)# 在A組中找到與B組紅色區域重合的區域a_overlap = cv2.bitwise_and(a_color_mask, b_red_mask)# 計算A組與B組紅色區域重合的像素數量a_overlap_area = cv2.countNonZero(a_overlap)# 計算A組有顏色區域占B組紅色區域的百分比overlap_percentage = (a_overlap_area / b_red_area) * 100 if b_red_area != 0 else 0return overlap_percentage# 示例調用
a_image_path = "path_to_a_image.jpg"
b_image_path = "path_to_b_image.jpg"
percentage = calculate_overlap_percentage(a_image_path, b_image_path)
print(f"A組顏色區域占B組紅色區域的百分比為: {percentage:.2f}%")
下面查看提取的mask是否正確
# 調整顯示圖像的大小(設置為目標寬度 600 像素)height, width = b_red_mask.shapetarget_width = 600target_height = int(target_width * height / width)# 使用 cv2.resize 調整圖像大小b_red_mask_resized = cv2.resize(b_red_mask, (target_width, target_height))# 顯示調整后的B組紅色掩膜cv2.imshow("B Red Mask", b_red_mask_resized)cv2.waitKey(0) # 等待按鍵按下cv2.destroyAllWindows() # 關閉所有窗口
?下面直接輸出圖片是戶更方便
cv2.imwrite("a_color_mask.png", a_color_mask)
?
把a組與b組文件夾下的所有對應的圖片進行計算,然后輸出到一個txt文件?
import cv2
import numpy as np
import osdef calculate_overlap_percentage(a_image_path, b_image_path):# 讀取A組和B組圖像a_image = cv2.imread(a_image_path)b_image = cv2.imread(b_image_path)# 將圖像從BGR轉為HSV色彩空間,便于顏色篩選a_hsv = cv2.cvtColor(a_image, cv2.COLOR_BGR2HSV)b_hsv = cv2.cvtColor(b_image, cv2.COLOR_BGR2HSV)# 設置B組紅色的HSV范圍lower_red = np.array([0, 100, 100])upper_red = np.array([10, 255, 255])# 提取B組紅色區域的掩膜b_red_mask = cv2.inRange(b_hsv, lower_red, upper_red)# 設置A組顏色區域的HSV范圍(棕色和綠色)# 棕色的HSV范圍lower_brown = np.array([10, 30, 30])upper_brown = np.array([25, 255, 200])# 綠色的HSV范圍lower_green = np.array([35, 50, 50])upper_green = np.array([85, 255, 255])# 提取A組棕色和綠色區域的掩膜a_brown_mask = cv2.inRange(a_hsv, lower_brown, upper_brown)a_green_mask = cv2.inRange(a_hsv, lower_green, upper_green)# 合并A組的棕色和綠色區域掩膜a_color_mask = cv2.bitwise_or(a_brown_mask, a_green_mask)# 計算B組紅色區域的像素數量b_red_area = cv2.countNonZero(b_red_mask)# 在A組中找到與B組紅色區域重合的區域a_overlap = cv2.bitwise_and(a_color_mask, b_red_mask)# 計算A組與B組紅色區域重合的像素數量a_overlap_area = cv2.countNonZero(a_overlap)# 計算A組有顏色區域占B組紅色區域的百分比overlap_percentage = (a_overlap_area / b_red_area) * 100 if b_red_area != 0 else 0return overlap_percentagedef process_images(a_folder, b_folder, output_file):# 獲取文件夾中的所有文件a_files = sorted(os.listdir(a_folder))b_files = sorted(os.listdir(b_folder))# 打開輸出文件with open(output_file, 'w') as f:# 遍歷文件夾中的每一對圖片for a_file, b_file in zip(a_files, b_files):# 拼接完整的文件路徑a_image_path = os.path.join(a_folder, a_file)b_image_path = os.path.join(b_folder, b_file)# 確保文件是圖片文件if not a_file.endswith(('.jpg', '.png', '.jpeg')) or not b_file.endswith(('.jpg', '.png', '.jpeg')):continue# 計算重疊百分比percentage = calculate_overlap_percentage(a_image_path, b_image_path)# 寫入結果到txt文件f.write(f'{a_file} vs {b_file}: {percentage:.2f}%\n')print(f'{a_file} vs {b_file}: {percentage:.2f}%')# 文件夾路徑
a_folder = 'path_to_a_folder' # A組文件夾路徑
b_folder = 'path_to_b_folder' # B組文件夾路徑
output_file = 'overlap_results.txt' # 輸出的txt文件路徑# 處理文件夾中的所有圖片并輸出到txt文件
process_images(a_folder, b_folder, output_file)