本文主要是介绍计算两张图片的结构相似性指数SSIM,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
结构相似性指数(SSIM)
主要考虑了人眼的感知特性,比较两幅图像的亮度、对比度和结构等特征。SSIM 取值范围在 [-1, 1] 之间,越接近 1 表示两幅图像越相似。比较一个文件中哪些图像存在相似的代码示例:
安装skimage:
pip install scikit-image -i https://mirrors.aliyun.com/pypi/simple/
完整如下:
import os
import sys
import cv2
import shutil
import numpy as np
from tqdm import tqdm
from skimage.metrics import structural_similarity as compare_ssimcurrent_dir = os.path.dirname(os.path.abspath(__file__))
base_dir = current_dir
sys.path.append(base_dir)# 读取一个文件夹的的图片路径列表
def list_files(src_dir, exts, is_dirpath=True):assert exts is not Noneif not isinstance(exts, (str, list, tuple)):raise TypeError('The type of exts must be str or a tuple/list of str, not' % type(exts))exts = [exts] if isinstance(exts, str) else extsfile_list = []for root, dirs, files in os.walk(src_dir):for file in files:if file.lower().endswith(tuple(exts)):if is_dirpath:file_list.append(os.path.normpath(os.path.join(root, file)))else:file_list.append(os.path.normpath(file))return file_list# 读取图片,转为灰度图,缩放为同一个尺寸
def read_ssim_im(fpath):img = np.fromfile(fpath, dtype=np.uint8)img = cv2.imdecode(img, cv2.IMREAD_GRAYSCALE)img = cv2.resize(img, (320, 240))return imgif __name__ == "__main__":src_dir = "D:\\001-数据集\\images"dst_dir = "D:\\001-数据集\\dst_images"os.makedirs(dst_dir, exist_ok=True)# 读取一个images文件夹的图像路径file_paths = list_files(src_dir=src_dir, exts=[".jpg", ".png"])l = len(file_paths)# 读取图像images_data = []for file_path in tqdm(file_paths):images_data.append(read_ssim_im(file_path))# 两两计算,如果相似移动到一个dst_images文件夹中for i in tqdm(range(l)):for j in range(l-i-1):ssim = compare_ssim(images_data[i], images_data[i+j+1], multichannel=True)# print('SSIM:', ssim)if ssim > 0.8:print('=== SSIM:', ssim)shutil.move(src=file_paths[i], dst=os.path.join(dst_dir, os.path.basename(file_paths[i])))shutil.move(src=file_paths[i+j+1], dst=os.path.join(dst_dir, os.path.basename(file_paths[i+j+1])))
如果有用,请 点赞、关注、收藏、分享
。
你的鼓励是我最大的动力
这篇关于计算两张图片的结构相似性指数SSIM的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!