平均哈希法matlab,均值哈希用于图像检索(matlab)

【实例简介】

提取图像灰度信息—>利用均值哈希算法得到图像的二值编码—>计算汉明距离判断图像相似性—>得到最终检索结果

【实例截图】

【核心代码】

ahash

└── ahash

├── BinToHex.m

├── Perceptual_ahash_algorithm.m

├── ahash.asv

├── ahash.m

├── database_gg

│   ├── 1.jpg

│   ├── 10.jpg

│   ├── 11.jpg

│   ├── 12.jpg

│   ├── 13.jpg

│   ├── 14.jpg

│   ├── 15.jpg

│   ├── 16.jpg

│   ├── 17.jpg

│   ├── 18.jpg

│   ├── 19.jpg

│   ├── 2.jpg

│   ├── 20.jpg

│   ├── 21.jpg

│   ├── 22.jpg

│   ├── 23.jpg

│   ├── 24.jpg

│   ├── 25.jpg

│   ├── 26.jpg

│   ├── 27.jpg

│   ├── 28.jpg

│   ├── 29.jpg

│   ├── 3.jpg

│   ├── 30.jpg

│   ├── 4.jpg

│   ├── 5.jpg

│   ├── 6.jpg

│   ├── 7.jpg

│   ├── 8.jpg

│   └── 9.jpg

├── database_ggjt

│   ├── 1.jpg

│   ├── 10.jpg

│   ├── 11.jpg

│   ├── 12.jpg

│   ├── 13.jpg

│   ├── 14.jpg

│   ├── 15.jpg

│   ├── 16.jpg

│   ├── 17.jpg

│   ├── 18.jpg

│   ├── 19.jpg

│   ├── 2.jpg

│   ├── 20.jpg

│   ├── 21.jpg

│   ├── 22.jpg

│   ├── 23.jpg

│   ├── 24.jpg

│   ├── 25.jpg

│   ├── 26.jpg

│   ├── 27.jpg

│   ├── 28.jpg

│   ├── 29.jpg

│   ├── 3.jpg

│   ├── 30.jpg

│   ├── 4.jpg

│   ├── 5.jpg

│   ├── 6.jpg

│   ├── 7.jpg

│   ├── 8.jpg

│   ├── 85.jpg

│   └── 9.jpg

├── hash.asv

├── quary.fig

├── readme.txt

├── retrieval.asv

├── retrieval.fig

└── retrieval.m

3 directories, 71 files

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
均值哈希是一种简单的图片相似度计算方,其主要思路是将图片缩小为 8*8 大小,然后计算其像素的平均值,再将每个像素与平均值进行比较,如果大于平均值,该像素设为 1,否则为 0,这样就得到了一个 64 位的哈希值。比较两张图片的相似度就是计算它们的哈希值的汉明距离(即两个哈希值对应位不同的数量)。 下面是用 C 语言实现均值哈希计算两张图片相似度的代码示例: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> typedef unsigned char uchar; // 缩小图片为 8*8 大小 void resize_image(uchar *src, int src_w, int src_h, uchar *dst, int dst_w, int dst_h) { int i, j; int w_ratio = src_w / dst_w; int h_ratio = src_h / dst_h; uchar *p_src = src; uchar *p_dst = dst; for (i = 0; i < dst_h; i++) { for (j = 0; j < dst_w; j++) { *p_dst++ = (*(p_src + i * h_ratio * src_w + j * w_ratio) + *(p_src + i * h_ratio * src_w + j * w_ratio + 1) + *(p_src + (i * h_ratio + 1) * src_w + j * w_ratio) + *(p_src + (i * h_ratio + 1) * src_w + j * w_ratio + 1)) / 4; } } } // 计算图片的平均像素值 uchar get_average_value(uchar *img, int w, int h) { int i, j; int sum = 0; uchar *p_img = img; for (i = 0; i < h; i++) { for (j = 0; j < w; j++) { sum += *p_img++; } } return sum / (w * h); } // 计算图片的均值哈希值 void get_hash_value(uchar *img, int w, int h, uchar *hash) { int i, j; uchar avg_value = get_average_value(img, w, h); uchar *p_img = img; uchar *p_hash = hash; for (i = 0; i < h; i++) { for (j = 0; j < w; j++) { *p_hash++ = (*p_img++ > avg_value) ? 1 : 0; } } } // 计算两个哈希值的汉明距离 int hamming_distance(uchar *hash1, uchar *hash2, int len) { int i, distance = 0; for (i = 0; i < len; i++) { if (hash1[i] != hash2[i]) { distance++; } } return distance; } int main() { uchar img1[256], img2[256], hash1[64], hash2[64]; int i, hamming_dist; // 读取图片数据,这里假设图片为 16*16 大小 FILE *fp1 = fopen("img1.raw", "rb"); fread(img1, 1, 256, fp1); fclose(fp1); FILE *fp2 = fopen("img2.raw", "rb"); fread(img2, 1, 256, fp2); fclose(fp2); // 缩小图片为 8*8 大小 uchar img1_resized[64], img2_resized[64]; resize_image(img1, 16, 16, img1_resized, 8, 8); resize_image(img2, 16, 16, img2_resized, 8, 8); // 计算图片的均值哈希值 get_hash_value(img1_resized, 8, 8, hash1); get_hash_value(img2_resized, 8, 8, hash2); // 计算两个哈希值的汉明距离 hamming_dist = hamming_distance(hash1, hash2, 64); printf("Hamming distance: %d\n", hamming_dist); return 0; } ``` 需要注意的是,这里假设图片为 16*16 大小,如果需要处理其他尺寸的图片,需要相应地修改代码。另外,由于哈希值是二进制的,可以使用位运算来进一步优化计算效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值