对图像颜色特征的提取主要有两种算法:量化颜色直方图和聚类颜色直方图
量化颜色直方图以单元(bin)由单元中心代表,统计落在量化单元的像素数量
优势:计算高效
劣势:量化问题、稀硫
聚类颜色直方图Lab
操作:使用聚类法对所有依点色向量进行米类,单元(bin)由聚类中心代表
优势:考虑了图颜色特征在整个空间的分布情况,避免出现大量bin中像素量非常稀硫的情况
劣势:两幅直方图相近的图像,只错开个bin,采用1距高或欧拉距高计算会得到很小的相似度
解决:考虑相似但不相同的颜色之间的相似度,一种足二次式距离,二足事先対图像进行平滑过滤,每个bin对相邻bin也有贡献
以下图为例:
OpenCV-Python中调用的直方图计算函数为cv2.calcHist
代码:
import cv2
import numpy as np
import matplotlib.pyplot as plt
def calcAndDrawHist(image, color):
hist= cv2.calcHist([image], [0], None, [256], [0.0,255.0])
minVal, maxVal, minLoc, maxLoc = cv2.minMaxLoc(hist)
histImg = np.zeros([256,256,3], np.uint8)
hpt = int(0.9* 256);
for h in range(256):
intensity = int(hist[h]*hpt/maxVal)
cv2.line(histImg,(h,256), (h,256-intensity), color)
return histImg
if __name__ == '__main__':
original_img = cv2.imread("cat.jpg")
img = cv2.resize(original_img,None,fx=0.6,fy=0.6,interpolation = cv2.INTER_CUBIC)
b, g, r = cv2.split(img)
histImgB = calcAndDrawHist(b, [0, 0, 255])
histImgG = calcAndDrawHist(g, [0, 255, 0])
histImgR = calcAndDrawHist(r, [255, 0, 0])
plt.title('histImgB')
plt.imshow(histImgB)
plt.show()
plt.imshow(histImgG)
plt.title('histImgG')
plt.show()
plt.imshow(histImgR)
plt.title('histImgR')
plt.show()
plt.imshow(img)
plt.title('Img')
plt.show()
聚类颜色直方图:
参考文献:https://blog.csdn.net/wsp_1138886114/article/details/80660014
close all
clear all
clc
blockSize=15; %每个block为15个像素
w0=0.6;
t0=0.1;
% A=200;
I=imread('./cat.jpg');
h = figure;
set(gcf,'outerposition',get(0,'screensize'));%获得SystemScreenSize 传递给当前图像句柄gcf的outerposition属性
subplot(221) %表示2(行数)*2(列数)的图像,1代表所画图形的序号
imshow(I);
title('Original Image');
subplot(222);
grayI=rgb2gray(I);
imshow(grayI,[]);
title('原图像灰度图')
subplot(223);
imhist(grayI,64);
%统计<50的像素所占的比例
%%%%%%%%%%%%%%%%%%%%%%
[COUNT x]=imhist(grayI);
under_50=0;
for i=0:50
under_50=under_50+COUNT(x==i);
end
under_50
total=size(I,1)*size(I,2)*size(I,3);
percent=under_50/total
percent
%%%%%%%%%%%%%%%%%%%%%%
function RGB_hist = RGB_Color_Histogram(f,r_n,g_n,b_n)
% 计算RGB图像的颜色直方图
% 参数列表中,f表示读取的RGB图像,r_n表示红色分量等分的份数,g_n表示绿色分量等分的份数,b_n表示蓝色分量等分的份数
% 彩色直方图共有r_n*g_n*b_n个bin,已知某像素颜色为(x1,x2,x3),则其在彩色直方图的第几个bin可以用以下公式计算:
% i_bin=x1*g_n*b_n+x2*b_n+x3+1
% 已知彩色直方图的第i个bin,则其对应的像素彩色可用以下公式计算:
% x1=fix(i/(g_n*b_n))
% x2=fix((i-x1*g_n*b_n)/b_n)
% x3=i-x1*g_n*b_n-x2*b_n-1
% 将图像转换为double类型,取值空间[0,1]
f=im2double(f);
% 取得红绿蓝三个颜色的分量
f_r=f(:,:,1);
f_g=f(:,:,2);
f_b=f(:,:,3);
% 对红绿蓝三个颜色的分量进行量化,取值在[0,等分份数-1]
f_r=fix(f_r*r_n);
f_g=fix(f_g*g_n);
f_b=fix(f_b*b_n);
% 对于超出量化区间的(也就是量化的颜色值等于等分份数的),进行减一操作,归于最大量化数(也即等分份数-1)
f_r=f_r-(f_r==r_n);
f_g=f_g-(f_g==g_n);
f_b=f_b-(f_b==b_n);
% 初始化直方图
RGB_hist = zeros(r_n*g_n*b_n,1);
% 对每个像素的颜色值进行编码,按照i_bin=x1*g_n*b_n+x2*b_n+x3+1进行计算
temp = f_r*g_n*b_n+f_g*b_n+f_b+1;
% 统计颜色值落入第i个bin的像素个数
for i=1:r_n*g_n*b_n
RGB_hist(i)=length(find(temp==i));
end