开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 2390|回复: 19
收起左侧

[其它源码] 图片相似度算法 有人愿意翻译吗?

[复制链接]
结帖率:30% (6/20)
发表于 2023-7-21 04:48:17 | 显示全部楼层 |阅读模式   江西省九江市
分享源码
界面截图: -
是否带模块: -
备注说明: -
[C++] 纯文本查看 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <float.h>

#define PI 3.14159265358979323846

// 定义结构相似性指数
double ssim(int *img1, int *img2, int width, int height, int sigma)
{
    double mu1, mu2, mu1_mu2, sigma1_pow, sigma2_pow, sigma12;
    double sum1, sum2, sum3, sum4;
    int x, y, i;
    double ssim_value = 0.0;

    // 计算每个像素的均值
    for (y = 0; y < height; y++) {
        for (x = 0; x < width; x++) {
            mu1 = mu2 = 0.0;
            for (i = -sigma; i <= sigma; i++) {
                if (y + i < 0 || y + i >= height)
                    continue;
                mu1 += img1[y + i * width + x];
                mu2 += img2[y + i * width + x];
            }
            mu1 /= (2 * sigma + 1);
            mu2 /= (2 * sigma + 1);
            mu1_mu2 += mu1 * mu2;
        }
    }

    // 计算每个像素的标准差
    for (y = 0; y < height; y++) {
        for (x = 0; x < width; x++) {
            sigma1_pow = sigma2_pow = 0.0;
            for (i = -sigma; i <= sigma; i++) {
                if (y + i < 0 || y + i >= height)
                    continue;
                sigma1_pow += (img1[y + i * width + x] - mu1) * (img1[y + i * width + x] - mu1);
                sigma2_pow += (img2[y + i * width + x] - mu2) * (img2[y + i * width + x] - mu2);
            }
            sigma1_pow /= (2 * sigma + 1);
            sigma2_pow /= (2 * sigma + 1);
            sigma12 += (sigma1_pow - pow(mu1_mu2, 0.5)) * (sigma2_pow - pow(mu1_mu2, 0.5));
        }
    }

    // 计算结构相似性指数
    for (y = 0; y < height; y++) {
        for (x = 0; x < width; x++) {
            sum1 += pow((img1[y * width + x] - mu1_mu2), 2);
            sum2 += pow((img2[y * width + x] - mu1_mu2), 2);
            sum3 += pow(sigma1_pow - pow(mu1_mu2, 0.5), 2);
            sum4 += pow(sigma2_pow - pow(mu1_mu2, 0.5), 2);
        }
        ssim_value += ((2 * mu1_mu2 * sigma12 + sum1 + sum2) /
                      (2 * sigma1_pow + 2 * sigma2_pow + sum3 + sum4));
    }

    return ssim_value / (width * height);
}

int main()
{
    int img1[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    int img2[] = {0, 1, 3, 3, 4, 5, 6, 7, 8, 9};
    int sigma = 3;
    int width = sizeof(img1) / sizeof(img1[0]);
    int height = sizeof(img1) / sizeof(img1[0]);
    double ssim_value = ssim(img1, img2, width, height, sigma);
    printf("SSIM value: %lf\n", ssim_value);


签到天数: 10 天

发表于 2024-8-1 17:10:40 | 显示全部楼层   四川省眉山市
谢谢分享
回复 支持 反对

使用道具 举报

签到天数: 21 天

发表于 2023-10-18 10:49:26 | 显示全部楼层   山东省临沂市
学习一下
回复 支持 反对

使用道具 举报

发表于 2023-7-24 20:58:08 | 显示全部楼层   江苏省南京市
学习一下
回复 支持 反对

使用道具 举报

签到天数: 14 天

发表于 2023-7-23 21:33:21 | 显示全部楼层   江苏省连云港市
感谢分享
回复 支持 反对

使用道具 举报

结帖率:14% (1/7)
发表于 2023-7-23 12:52:11 | 显示全部楼层   浙江省金华市
翻译好了 Delphi
[Pascal] 纯文本查看 复制代码
function ssim(img1, img2: Tbytes; width, height, sigma: Integer): Double;
var
  mu1, mu2, mu1_mu2, sigma1_pow, sigma2_pow, sigma12: double;
  sum1, sum2, sum3, sum4: double;
  x, y, i: Integer;
  ssim_value: double;
begin
  // 计算每个像素的均值
  for y := 0 to height - 1 do
  begin
    for x := 0 to width - 1 do
    begin
      mu1 := 0;
      mu2 := 0;
      for i := -sigma to sigma do
      begin
        if (y + i < 0) or (y + i >= height) then
          continue;
        mu1 := mu1 + img1[y + i * width + x];
        mu2 := mu2 + img2[y + i * width + x];
      end;
      mu1 := mu1 / (2 * sigma + 1);
      mu2 := mu2 / (2 * sigma + 1);
      mu1_mu2 := mu1_mu2 + (mu1 * mu2);
    end;
  end;

  // 计算每个像素的标准差
  for y := 0 to height - 1 do
  begin
    for x := 0 to width - 1 do
    begin
      sigma1_pow := 0;
      sigma2_pow := 0;
      for i := -sigma to sigma do
      begin
        if (y + i < 0) or (y + i >= height) then
          continue;
        sigma1_pow := sigma1_pow + (img1[y + i * width + x] - mu1) * (img1[y + i * width + x] - mu1);
        sigma2_pow := sigma2_pow + (img2[y + i * width + x] - mu2) * (img2[y + i * width + x] - mu2);
      end;
      sigma1_pow := sigma1_pow / (2 * sigma + 1);
      sigma2_pow := sigma2_pow / (2 * sigma + 1);
      sigma12 := sigma12 + (sigma1_pow - Power(mu1_mu2, 0.5)) * (sigma2_pow - Power(mu1_mu2, 0.5));
    end;
  end;

  // 计算结构相似性指数
  for y := 0 to height - 1 do
  begin
    for x := 0 to width - 1 do
    begin
      sum1 := sum1 + power((img1[y * width + x] - mu1_mu2), 2);
      sum2 := sum2 + power((img2[y * width + x] - mu1_mu2), 2);
      sum3 := sum3 + power(sigma1_pow - power(mu1_mu2, 0.5), 2);
      sum4 := sum4 + power(sigma2_pow - power(mu1_mu2, 0.5), 2);
    end;
    ssim_value := ssim_value + ((2 * mu1_mu2 * sigma12 + sum1 + sum2) / (2 * sigma1_pow + 2 * sigma2_pow + sum3
      + sum4));
  end;
  Result := ssim_value / (width * height);
end;

回复 支持 反对

使用道具 举报

签到天数: 17 天

发表于 2023-7-23 10:25:22 | 显示全部楼层   广东省湛江市
已经顶贴,感谢您对论坛的支持!
回复 支持 反对

使用道具 举报

结帖率:80% (4/5)

签到天数: 2 天

发表于 2023-7-21 19:47:36 | 显示全部楼层   山东省潍坊市
已经顶贴,感谢您对论坛的支持!
回复 支持 反对

使用道具 举报

结帖率:73% (8/11)

签到天数: 25 天

发表于 2023-7-21 16:06:11 | 显示全部楼层   河南省焦作市
学习一下
回复 支持 反对

使用道具 举报

发表于 2023-7-21 15:57:52 | 显示全部楼层   美国
[Python] 纯文本查看 复制代码
def ssim(img1: list, img2: list, width: int, height: int, sigma: int) -> float:
    """
    计算结构相似性指数
    :param img1:  图像1
    :param img2:  图像2
    :param width:  图像宽度
    :param height:  图像高度
    :param sigma:  高斯核标准差
    :return:
    """
    mu1, mu2, mu1_mu2, sigma1_pow, sigma2_pow, sigma12 = 0, 0, 0, 0, 0, 0
    sum1, sum2, sum3, sum4 = 0, 0, 0, 0
    ssim_value = 0.0

    # 计算每个像素的均值
    for y in range(height):
        for x in range(width):
            mu1 = mu2 = 0.0
            for i in range(-sigma, sigma + 1):
                if y + i < 0 or y + i >= height:
                    continue
                mu1 += img1[y + i * width + x]
                mu2 += img2[y + i * width + x]
            mu1 /= (2 * sigma + 1)
            mu2 /= (2 * sigma + 1)
            mu1_mu2 += mu1 * mu2

    # 计算每个像素的标准差
    for y in range(height):
        for x in range(width):
            sigma1_pow = sigma2_pow = 0.0
            for i in range(-sigma, sigma + 1):
                if y + i < 0 or y + i >= height:
                    continue
                sigma1_pow += (img1[y + i * width + x] - mu1) ** 2
                sigma2_pow += (img2[y + i * width + x] - mu2) ** 2
            sigma1_pow /= (2 * sigma + 1)
            sigma2_pow /= (2 * sigma + 1)
            sigma12 += (sigma1_pow - pow(mu1_mu2, 0.5)) * (sigma2_pow - pow(mu1_mu2, 0.5))

    # 计算结构相似性指数
    for y in range(height):
        for x in range(width):
            sum1 += (img1[y * width + x] - mu1_mu2) ** 2
            sum2 += (img2[y * width + x] - mu1_mu2) ** 2
            sum3 += (sigma1_pow - pow(mu1_mu2, 0.5)) ** 2
            sum4 += (sigma2_pow - pow(mu1_mu2, 0.5)) ** 2
        ssim_value += ((2 * mu1_mu2 * sigma12 + sum1 + sum2) /
                       (2 * sigma1_pow + 2 * sigma2_pow + sum3 + sum4))

    return ssim_value / (width * height)


_img1 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
_img2 = [0, 1, 3, 3, 4, 5, 6, 7, 8, 9]
_sigma = 3
_width = len(_img1)
_height = len(_img1) // _width
print("SSIM value:", ssim(_img1, _img2, _width, _height, _sigma))
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表