【图像处理】颜色距离

本篇文章主要描述颜色距离及其具体颜色距离的实现。

1、颜色距离

颜色距离指的是两个颜色之间的差距,通常距离越大,两个颜色相差越大,反之,两个颜色越相近。在计算颜色距离时,有类似计算两点间欧式距离的公式一样,在RGB空间内,可以得到两个颜色之间的距离为:


这里写图片描述

其中,C1 C2表示颜色1和颜色2,C1R表示颜色1的R通道。
但是,由于RGB空间是线性的并且相互正交,而人眼的视觉系统并不是线性的,RGB空间并不能反映人眼对颜色的感知,相对应的颜色距离也不能很好的反映两个颜色是否相近。

针对这个问题,于是有了LAB颜色空间,及其对应的色差计算。

2、LAB颜色空间及色差计算

LAB颜色空间是基于人眼对颜色的感知,可以表示人眼所能感受到的所有颜色。L表示明度,A表示红绿色差,B表示蓝黄色差。两个颜色之见的色差:


这里写图片描述

ΔE 表示色差,ΔL/Δa/Δb分别表示两个颜色之间在不同分量的差值。

为了简化计算及保证计算效果,有人在RGB空间上通过公式计算出加权的欧式距离。

3、改进的加权欧式距离

以下为具体的计算方法,详细说明可以参考:链接


这里写图片描述

具体的C代码如下:

typedef struct {
   unsigned char r, g, b;
} RGB;

double ColourDistance(RGB e1, RGB e2)
{
  long rmean = ( (long)e1.r + (long)e2.r ) / 2;
  long r = (long)e1.r - (long)e2.r;
  long g = (long)e1.g - (long)e2.g;
  long b = (long)e1.b - (long)e2.b;
  return sqrt((((512+rmean)*r*r)>>8) + 4*g*g + (((767-rmean)*b*b)>>8));
}
以下是使用MATLAB计算颜色距离的示例代码: %% 读入图像并转换为LAB颜色空间 img = imread('testimage.jpg'); img = imresize(img, [256, 256]); % 调整图像大小以加快计算速度 lab = rgb2lab(img); %% 选择两个像素进行颜色距离计算 pixel1 = lab(50,50,:); pixel2 = lab(200,200,:); %% 计算欧几里德距离 dist_euc = sqrt(sum((pixel1 - pixel2).^2)); %% 计算CIEDE2000距离 dist_ciede2000 = ciede2000(pixel1, pixel2); %% 打印结果 disp(['欧几里德距离:' num2str(dist_euc)]); disp(['CIEDE2000距离:' num2str(dist_ciede2000)]); %% CIEDE2000距离计算函数 function [ delta_e ] = ciede2000( lab1, lab2 ) %CIEDE2000 Calculate the distance between two LAB colors in CIEDE2000 color space % Constants k_L = 1; k_C = 1; k_H = 1; l1 = lab1(1); a1 = lab1(2); b1 = lab1(3); l2 = lab2(1); a2 = lab2(2); b2 = lab2(3); % Calculate C1 and C2 C1 = sqrt(a1^2 + b1^2); C2 = sqrt(a2^2 + b2^2); % Calculate average C C_avg = (C1 + C2) / 2; % Calculate G G = 0.5 * (1 - sqrt(C_avg^7 / (C_avg^7 + 25^7))); % Calculate a'1 and a'2 a1_prime = (1 + G) * a1; a2_prime = (1 + G) * a2; % Calculate C'1 and C'2 C1_prime = sqrt(a1_prime^2 + b1^2); C2_prime = sqrt(a2_prime^2 + b2^2); % Calculate h'1 and h'2 h1_prime = atan2(b1, a1_prime); h2_prime = atan2(b2, a2_prime); % Deal with hue wrap-arounds if abs(h1_prime - h2_prime) > pi if h2_prime <= h1_prime h2_prime = h2_prime + 2*pi; else h1_prime = h1_prime + 2*pi; end end % Calculate delta_L_prime, delta_C_prime and delta_H_prime delta_L_prime = l2 - l1; delta_C_prime = C2_prime - C1_prime; delta_h_prime = h2_prime - h1_prime; delta_h_prime = delta_h_prime - 2*pi*fix(delta_h_prime/(2*pi)); delta_H_prime = 2*sqrt(C1_prime*C2_prime)*sin(delta_h_prime/2); % Calculate L'avg, C'avg, h'avg L_avg = (l1 + l2) / 2; C_avg_prime = (C1_prime + C2_prime) / 2; h_avg_prime = h1_prime + h2_prime; if abs(h1_prime - h2_prime) > pi if h_avg_prime < 2*pi h_avg_prime = h_avg_prime + 2*pi; else h_avg_prime = h_avg_prime - 2*pi; end end h_avg_prime = h_avg_prime / 2; % Calculate delta_L, delta_C, delta_H delta_L = delta_L_prime; delta_C = delta_C_prime; delta_H = delta_H_prime; if C1_prime * C2_prime == 0 delta_H = 0; else if abs(h1_prime - h2_prime) <= pi delta_H = delta_H; elseif h_avg_prime < pi delta_H = delta_H + 2*pi; elseif h_avg_prime >= pi delta_H = delta_H - 2*pi; end end % Calculate L* C* H* L_star = L_avg; C_star = C_avg_prime; H_star = h_avg_prime; if C1_prime * C2_prime == 0 H_star = h1_prime + h2_prime; if abs(h1_prime - h2_prime) > pi if H_star < 2*pi H_star = H_star + 2*pi; else H_star = H_star - 2*pi; end end H_star = H_star / 2; else H_star = (h1_prime + h2_prime) / 2; end % Calculate T, S, C_ph, H_ph T = 1 - 0.17*cos(H_star - pi/6) + 0.24*cos(2*H_star) + 0.32*cos(3*H_star+pi/30) - 0.2*cos(4*H_star-63*pi/180); S = 1 + (0.015*(L_star - 50)^2) / sqrt(20 + (L_star - 50)^2); C_ph = sqrt(C_star^7 / (C_star^7 + 25^7)); H_ph = H_star - pi/3 * exp(-((H_star - pi/3) / (2*pi/3))^2); % Calculate delta_theta, R_C, R_T delta_theta = pi/6 * exp(-((180/pi*H_ph - 275) / 25)^2); R_C = 2*C_ph^7 / (C_ph^7 + 25^7); R_T = -sin(2*delta_theta) * R_C; % Calculate delta_E00 delta_E00 = sqrt((delta_L / (k_L*S))^2 + (delta_C / (k_C*S))^2 + (delta_H / (k_H*S))^2 + R_T*(delta_C / (k_C*S))*(delta_H / (k_H*S))); end
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值