匀光匀色--直方图匹配算法实现与应用

一、直方图匹配(直方图规定化)算法:是以一个图像直方图作为模板,使待处理图像直方图与模板直方图近似。

算法流程:

  1. 分别计算模板影像和待处理影像累积直方图(统计像素值在0~255上分布比例);
  2. 一次计算待图像直方图上每个值到模板图像直方图每个值之间差值,生成256个差值表;
  3. 计算每个差值表中最小值,将最小值索引作为该差值表对应待处理图像值变换后值,生成查找表;
  4. 通过查找表对待处理图像进行处理。

实现步骤:

  1. 计算累积直方图:

计算直方图

Map<Integer, Double> map = new HashMap<>();
		int width = image.getWidth();
		int height = image.getHeight();
		double totalPixel = width * height;
		double rate = 1 / (3 * totalPixel);
		for (int i = 0; i < 256; i++) {
			map.put(i, 0.0);// 通过循环,往集合里面填充0~255个位置,初始值都为0
		}
		//分别统计图像上0~255上分布总数
		for (int i = 0; i < image.getWidth(); i++) {
			for (int j = 0; j < image.getHeight(); j++) {
				int rgb = image.getRGB(i, j);
				int r = (rgb >> 16) & 0xff;
				int g = (rgb >> 8) & 0xff;
				int b = rgb & 0xff;
				map.put(r, map.get(r) + rate);
				map.put(g, map.get(g) + rate);
				map.put(b, map.get(b) + rate);
			}
		}

计算累积直方图

for(int i = 0; i < 256;i++) {
			tempSum += tempMap.get(i);
			imageSum += imageMap.get(i);
			tempList[i] = tempSum;
			imageList[i] = imageSum;
		}

2.计算差值表

List<Double[]> differenceList = new ArrayList<>();
		for(int i = 0; i < 256;i++) {
			Double[] differenceTable = new Double[256];
			for(int j = 0; j< 256;j++) {
				differenceTable[j] = Math.abs(imageList[i] - tempList[j]);
			}
			differenceList.add(differenceTable);
		}

3.计算差值表最小值,生成查找表

for(int i = 0; i < 256;i++) {
			Double[] differenceTable = differenceList.get(i);
			Double[] sortTable = new Double[256];
			for(int j = 0; j < 256;j++) {
				sortTable[j] = differenceTable[j];
			}
			Arrays.sort(sortTable);
			double mini = sortTable[0];
			Double[] table = differenceList.get(i);
			for(int j = 0; j < 256; j++) {
				if (mini == table[j]) {
					resultTable[i] = j;
				}
			}
		}

4.通过查找表处理图像

for(int i = 0; i < width; i++) {
			for(int j = 0 ;j < height;j++) {
				int rgb = image.getRGB(i, j);
				int r = (rgb >> 16) & 0xff;
				int g = (rgb >> 8) & 0xff;
				int b = rgb & 0xff;
				r = rTable[r];
				g = gTable[g];
				b = bTable[b];
				rgb = (r & 0xff) << 16 | (g & 0xff) << 8 | b & 0xff;
				resultImage.setRGB(i, j, rgb);
 			}
		}
		return resultImage;

二、使用直方图匹配算法对图像进行匀光匀色。选取两幅不同色调的图像使用直方图匹配算法进行处理。

模板图像:

待处理图像:

处理后:

结论:处理前模板图像与待处理图像色调差异较大,处理后图像整体色调与模板图像非常接近。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TheMatrixs

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值