feat: enhance image comparison functionality in gimp.py
- Added resizing logic to handle images of different sizes before comparison, ensuring consistent evaluation. - Implemented mode conversion to ensure both images are in the same format for accurate comparison. - Enhanced structure check by MSE to support conversion of numpy arrays to PIL Images, improving compatibility. - Maintained existing logic while improving robustness and accuracy of image comparison methods.
This commit is contained in:
@@ -17,6 +17,16 @@ def compare_image_list(pred_img_path_list: Union[str, List[str]],
|
|||||||
return 0.0
|
return 0.0
|
||||||
pred_img = Image.open(pred_img_path)
|
pred_img = Image.open(pred_img_path)
|
||||||
gold_img = Image.open(gold_img_path)
|
gold_img = Image.open(gold_img_path)
|
||||||
|
|
||||||
|
# Check if images have different sizes and resize if necessary
|
||||||
|
if pred_img.size != gold_img.size:
|
||||||
|
logging.debug(f"Images have different sizes: {pred_img.size} vs {gold_img.size}, resizing predicted image to match gold image")
|
||||||
|
pred_img = pred_img.resize(gold_img.size, Image.Resampling.LANCZOS)
|
||||||
|
|
||||||
|
# Ensure both images are in the same mode for comparison
|
||||||
|
if pred_img.mode != gold_img.mode:
|
||||||
|
pred_img = pred_img.convert(gold_img.mode)
|
||||||
|
|
||||||
diff = ImageChops.difference(pred_img, gold_img)
|
diff = ImageChops.difference(pred_img, gold_img)
|
||||||
if diff.getbbox():
|
if diff.getbbox():
|
||||||
return 0.0
|
return 0.0
|
||||||
@@ -190,6 +200,27 @@ def calculate_image_sharpness(image_path):
|
|||||||
|
|
||||||
def structure_check_by_mse(img1, img2, threshold=0.03):
|
def structure_check_by_mse(img1, img2, threshold=0.03):
|
||||||
"""Check if two images are approximately the same by MSE"""
|
"""Check if two images are approximately the same by MSE"""
|
||||||
|
|
||||||
|
# Ensure both images are PIL Image objects
|
||||||
|
if not hasattr(img1, 'size') or not hasattr(img2, 'size'):
|
||||||
|
# Convert numpy arrays to PIL Images if needed
|
||||||
|
if hasattr(img1, 'shape'):
|
||||||
|
img1 = Image.fromarray(img1)
|
||||||
|
if hasattr(img2, 'shape'):
|
||||||
|
img2 = Image.fromarray(img2)
|
||||||
|
|
||||||
|
# Check if images have different sizes and resize if necessary
|
||||||
|
if img1.size != img2.size:
|
||||||
|
logging.debug(f"Images have different sizes: {img1.size} vs {img2.size}, resizing first image to match second")
|
||||||
|
img1 = img1.resize(img2.size, Image.Resampling.LANCZOS)
|
||||||
|
|
||||||
|
# Ensure both images are in RGB mode for consistent comparison
|
||||||
|
if img1.mode != 'RGB':
|
||||||
|
img1 = img1.convert('RGB')
|
||||||
|
if img2.mode != 'RGB':
|
||||||
|
img2 = img2.convert('RGB')
|
||||||
|
|
||||||
|
# Now calculate MSE with properly sized images
|
||||||
mse = np.mean(
|
mse = np.mean(
|
||||||
(np.array(img1, dtype=np.float32) / 255
|
(np.array(img1, dtype=np.float32) / 255
|
||||||
- np.array(img2, dtype=np.float32) / 255) ** 2)
|
- np.array(img2, dtype=np.float32) / 255) ** 2)
|
||||||
|
|||||||
Reference in New Issue
Block a user