2010-02-05 11:09:00 daoqinglin 阅读数 6498
• ###### Matplotlib 数据分析可视化

数据分析三剑客，NumPy、Pandas、Matplotlib，本课程是对Matplotlib的讲解，Matplotlib可以是分析的数据可视化，可以更直观的查看数据分析的结果，本课程独辟蹊径，不光教大家如何绘图，例如：饼图、柱状图、条形图、直方图等，而且深入剖析的Matplotlib的绘图原理，例如：如何操作图片，如何加载本地数据等。

15303 人正在学习 去看看 郭宏志

在图像处理技术领域，通常分析彩色图像是对RGB模式下各分量进行分析。如果要进行颜色识别，利用RGB各分量的组合进行分析图像的颜色就比较困难了，所以需要将彩色图像从RGB模式下转换到HSV模式（维基百科）下，分析图像颜色，并设计出颜色分布的直方图，并重新转换到RGB模式下进行显示。本算法是在matlab环境下实现的。具体代码如下：

%%================================

clear
clc
close all
[M,N,O] = size(Image);
[h,s,v] = rgb2hsv(Image);

H = h; S = s; V = v;
h = h*360;
%将hsv空间非等间隔量化：
%  h量化成16级；
%  s量化成4级；
%  v量化成4级；
for i = 1:M
for j = 1:N
if h(i,j)<=15||h(i,j)>345
H(i,j) = 0;
end
if h(i,j)<=25&&h(i,j)>15
H(i,j) = 1;
end
if h(i,j)<=45&&h(i,j)>25
H(i,j) = 2;
end
if h(i,j)<=55&&h(i,j)>45
H(i,j) = 3;
end
if h(i,j)<=80&&h(i,j)>55
H(i,j) = 4;
end
if h(i,j)<=108&&h(i,j)>80
H(i,j) = 5;
end
if h(i,j)<=140&&h(i,j)>108
H(i,j) = 6;
end
if h(i,j)<=165&&h(i,j)>140
H(i,j) = 7;
end
if h(i,j)<=190&&h(i,j)>165
H(i,j) = 8;
end
if h(i,j)<=220&&h(i,j)>190
H(i,j) = 9;
end
if h(i,j)<=255&&h(i,j)>220
H(i,j) = 10;
end
if h(i,j)<=275&&h(i,j)>255
H(i,j) = 11;
end
if h(i,j)<=290&&h(i,j)>275
H(i,j) = 12;
end
if h(i,j)<=316&&h(i,j)>290
H(i,j) = 13;
end
if h(i,j)<=330&&h(i,j)>316
H(i,j) = 14;
end
if h(i,j)<=345&&h(i,j)>330
H(i,j) = 15;
end
end
end
for i = 1:M
for j = 1:N
if s(i,j)<=0.15&&s(i,j)>0
S(i,j) = 1;
end
if s(i,j)<=0.4&&s(i,j)>0.15
S(i,j) = 2;
end
if s(i,j)<=0.75&&s(i,j)>0.4
S(i,j) = 3;
end
if s(i,j)<=1&&s(i,j)>0.75
S(i,j) = 4;
end
end
end
for i = 1:M
for j = 1:N
if v(i,j)<=0.15&&v(i,j)>0
V(i,j) = 1;
end
if v(i,j)<=0.4&&v(i,j)>0.15
V(i,j) = 2;
end
if v(i,j)<=0.75&&v(i,j)>0.4
V(i,j) = 3;
end
if v(i,j)<=1&&v(i,j)>0.75
V(i,j) = 4;
end
end
end

% 构建4*16二维数组存放H-S数据
Hist = zeros(16,4);
for i = 1:M
for j = 1:N
for k = 1:16
for l = 1:4
if  l==S(i,j)&& k==H(i,j)+1
Hist(k,l) = Hist(k,l)+1;
end
end
end
end
end
for k = 1:16
for l =1:4
His((k-1)*4+l) = Hist(k,l);%转化为一维数组
end
end
His = His/sum(His)*1000;
% 手工绘制彩色图像直方图
% hist_h
m=0;
for j = 1:300
if rem(j,16)==1 && m<16
for k = 0:15
for i = 1:200
hist_h(i,j+k) = m;
end
end
m = m+1;
end
end
% hist_s
m=0;
for j = 1:300
if rem(j,4) == 1 && m<64
n = rem(m,4);
for k = 0:3
for i =1:200
hist_s(i,j+k) = n+1;
end
end
m = m+1;
end
end
% hist_v
for j = 1:256
for i = 1:200
hist_v(i,j) = 0.98;
end
end
% 把His赋值给hist_v
for k = 1:64
for j = 1:256
if floor((j-1)/4) == k
for i = 1:200
if i<200-His(k+1)%i>His(k+1)%
hist_v(i,j) = 0;
end
end
end
end
end

I_H = hsv2rgb(hist_h/16,hist_s/4,hist_v);

% 画图显示
figure;
subplot(3,2,1),imshow(Image),title('原图');
subplot(3,2,2),imshow(H,[]),title('H分量图');
subplot(3,2,3),imshow(S,[]),title('S分量图');
subplot(3,2,4),imshow(V,[]),title('V分量图');
subplot(3,2,5),imshow(I_rgb,[]),title('色彩量化后的RGB图像');
subplot(3,2,6),imshow(I_H,[]),title('H-S直方图');
figure,imshow(I_H);

%%=======================================

2019-04-07 16:02:33 SoaringLee_fighting 阅读数 1096
• ###### Matplotlib 数据分析可视化

数据分析三剑客，NumPy、Pandas、Matplotlib，本课程是对Matplotlib的讲解，Matplotlib可以是分析的数据可视化，可以更直观的查看数据分析的结果，本课程独辟蹊径，不光教大家如何绘图，例如：饼图、柱状图、条形图、直方图等，而且深入剖析的Matplotlib的绘图原理，例如：如何操作图片，如何加载本地数据等。

15303 人正在学习 去看看 郭宏志

#### Date: 2019-4-7

##### 前言

在图像处理技术领域，通常分析彩色图像是对RGB模式下各分量进行分析。如果要进行颜色识别，利用RGB各分量的组合进行分析图像的颜色就比较困难了，所以需要将彩色图像从RGB模式下转换到HSV模式下，分析图像颜色，并设计出颜色分布的直方图，并重新转换到RGB模式下进行显示。本文提供了颜色主分量和颜色分量比例提取的matlab实现方法。

##### 2、颜色主分量和颜色分量比例提取

Matlab实现代码（部分）：

``````%色彩分析 颜色占比
Image = Img;
[M,N,O] = size(Image);
[h,s,v] = rgb2hsv(Image);

H = h; S = s; V = v;
h = h*360;
%将hsv空间非等间隔量化：
%? h量化成16级；
%? s量化成4级；
%? v量化成4级；
for i = 1:M
for j = 1:N
if h(i,j)<=15||h(i,j)>345
H(i,j) = 0;
end
if h(i,j)<=25&&h(i,j)>15
H(i,j) = 1;
end
if h(i,j)<=45&&h(i,j)>25
H(i,j) = 2;
end
if h(i,j)<=55&&h(i,j)>45
H(i,j) = 3;
end
if h(i,j)<=80&&h(i,j)>55
H(i,j) = 4;
end
if h(i,j)<=108&&h(i,j)>80
H(i,j) = 5;
end
if h(i,j)<=140&&h(i,j)>108
H(i,j) = 6;
end
if h(i,j)<=165&&h(i,j)>140
H(i,j) = 7;
end
if h(i,j)<=190&&h(i,j)>165
H(i,j) = 8;
end
if h(i,j)<=220&&h(i,j)>190
H(i,j) = 9;
end
if h(i,j)<=255&&h(i,j)>220
H(i,j) = 10;
end
if h(i,j)<=275&&h(i,j)>255
H(i,j) = 11;
end
if h(i,j)<=290&&h(i,j)>275
H(i,j) = 12;
end
if h(i,j)<=316&&h(i,j)>290
H(i,j) = 13;
end
if h(i,j)<=330&&h(i,j)>316
H(i,j) = 14;
end
if h(i,j)<=345&&h(i,j)>330
H(i,j) = 15;
end
end
end

for i = 1:M
for j = 1:N
if s(i,j)<=0.15&&s(i,j)>0
S(i,j) = 1;
end
if s(i,j)<=0.4&&s(i,j)>0.15
S(i,j) = 2;
end
if s(i,j)<=0.75&&s(i,j)>0.4
S(i,j) = 3;
end
if s(i,j)<=1&&s(i,j)>0.75
S(i,j) = 4;
end
end
end

for i = 1:M
for j = 1:N
if v(i,j)<=0.15&&v(i,j)>0
V(i,j) = 1;
end
if v(i,j)<=0.4&&v(i,j)>0.15
V(i,j) = 2;
end
if v(i,j)<=0.75&&v(i,j)>0.4
V(i,j) = 3;
end
if v(i,j)<=1&&v(i,j)>0.75
V(i,j) = 4;
end
end
end

% 构建4*16二维数组存放H-S数据
Hist = zeros(16,4);
for i = 1:M
for j = 1:N
for k = 1:16
for l = 1:4
if  l==S(i,j)&& k==H(i,j)+1
Hist(k,l) = Hist(k,l)+1;
end
end
end
end
end
for k = 1:16
for l =1:4
His((k-1)*4+l) = Hist(k,l);%转化为一维数组
end
end
His = His/sum(His)*1000;

% 手工绘制彩色图像直方图
% hist_h
m=0;
for j = 1:300
if rem(j,16)==1 && m<16
for k = 0:15
for i = 1:200
hist_h(i,j+k) = m;
end
end
m = m+1;
end
end
% hist_s
m=0;
for j = 1:300
if rem(j,4) == 1 && m<64
n = rem(m,4);
for k = 0:3
for i =1:200
hist_s(i,j+k) = n+1 ;
end
end
m = m+1;
end
end
% hist_v
for j = 1:256
for i = 1:200
hist_v(i,j) = 0.98;
end
end
% 把His赋值给hist_v
for k = 1:64
for j = 1:256
if floor((j-1)/4) == k
for i = 1:200
if i<200-His(k+1)%i>His(k+1)%
hist_v(i,j) = 0;
end
end
end
end
end

%将h、s、v分量图合并转化为RGB模式
I_H = hsv2rgb(hist_h/16,hist_s/4,hist_v);

% 画图显示?
axes(handles.axes2);
imshow(I_H,[]),title('颜色分量占比');

``````

## THE END!

2016-07-28 22:38:11 dcrmg 阅读数 2681
• ###### Matplotlib 数据分析可视化

数据分析三剑客，NumPy、Pandas、Matplotlib，本课程是对Matplotlib的讲解，Matplotlib可以是分析的数据可视化，可以更直观的查看数据分析的结果，本课程独辟蹊径，不光教大家如何绘图，例如：饼图、柱状图、条形图、直方图等，而且深入剖析的Matplotlib的绘图原理，例如：如何操作图片，如何加载本地数据等。

15303 人正在学习 去看看 郭宏志

HSV颜色模型：

RGB模型是图像处理中常用的颜色模型，多用于颜色显示和图像处理，三维坐标中H(Hue)代表色调，S(Saturation)代表饱和度，V代表(Value)明度，理解起来很容易，是一种针对用户观感的一种颜色模型，侧重于色彩表示，什么颜色、深浅如何、明暗如何，跟人眼的直观感受很契合。

1.截取一部分肤色区域，作为检测目标的样本；
2.对样本做直方图计算，并归一化直方图；
3.利用归一化后的直方图，通过calcBackProject函数在原图像中检索，与样本具有表现一致的直方图区域将会被作为肤色检测出来；

calcHist函数之前已经做过介绍，函数原型及参数说明可以ca见：直方图该怎么画

```void normalize( InputArray src, OutputArray dst, double alpha=1, double beta=0,
int norm_type=NORM_L2, int dtype=-1, InputArray mask=noArray());```

normalize函数作用是归一化计算出来的直方图。

calcBackProject函数原型：

```calcBackProject(&image,       //目标图像
1,            // 图像个数
channels,     // 通道数量
histogram,    // 进行反投影的直方图
result,       // 结果图像
ranges,       // 每个维度的阈值
255.0         // 放缩因子
);  ```

```#include "core/core.hpp"
#include "highgui/highgui.hpp"
#include "imgproc/imgproc.hpp"

using namespace cv;

Mat image,imageHSV,imageHist,imageNorm,imagecalcBack;
Mat imagegirl,imagegirlHSV;

int histSize=1;
float histR[]={0,255};
const float *histRange=histR;

int channels[]={0,1};

void TrackBarFun(int ,void(*));

int main(int argc,char *argv[])
{
cvtColor(imagegirl,imagegirlHSV,CV_RGB2HSV);
if(!image.data)
{
return -1;
}
cvtColor(image,imageHSV,CV_RGB2HSV);
namedWindow("HSV");
createTrackbar("bins控制","HSV",&histSize,100,TrackBarFun);
TrackBarFun(0,0);
waitKey();
}
void TrackBarFun(int ,void(*))
{
if(histSize==0)
{
histSize=1;
}
calcHist(&imageHSV,2,channels,Mat(),imageHist,1,&histSize,&histRange,true,false);
normalize(imageHist,imageNorm,0,255,NORM_MINMAX,-1,Mat());
calcBackProject(&imagegirlHSV,2,channels,imageNorm,imagecalcBack,&histRange,1,true);
imshow("Source",imagegirl);
imshow("HSV",imagegirlHSV);
imshow("CalcBack",imagecalcBack);
}```

2010-08-14 15:25:00 tlovet1314 阅读数 1574
• ###### Matplotlib 数据分析可视化

数据分析三剑客，NumPy、Pandas、Matplotlib，本课程是对Matplotlib的讲解，Matplotlib可以是分析的数据可视化，可以更直观的查看数据分析的结果，本课程独辟蹊径，不光教大家如何绘图，例如：饼图、柱状图、条形图、直方图等，而且深入剖析的Matplotlib的绘图原理，例如：如何操作图片，如何加载本地数据等。

15303 人正在学习 去看看 郭宏志

5.1 反色

1.定义： 反色(invert)就是形成底片效果。

2.用途： 当黑色区域占比较大区域时，可以利用反色，节省打印的墨。

3.做法：反色的实际含义是将RGB值反转。

1）真彩图。真彩图不带调色板，每个象素用3个字节，表示RGB三个分量。所以处理很简单，把反转后的RGB值写入新图即可。

2）带调色板的彩色图。只需要将调色板中的颜色反转，形成新调色板，而位图数据不用动，就能够实现反转。

3）灰度图，是一种特殊的伪彩色图，所以反转的处理和上面讲的一样。

5.2 彩色图转灰度图

1.定义：YUV的颜色表示方法，在这种表示方法中，Y分量的物理含义就是亮度，它含了灰度图的所有信息，只用Y分量就完全能够表示出一幅灰度图来。

2.做法：

1）真彩图。根据RGB的值求出Y值后，将RGB值都赋值成Y，写入新图即可。由于改成灰度图后，是必须带一个256色的调色板，并把图像中的内容改变为对调色板的索引值。

2）彩色图。我们只需要将调色板中的彩色变成灰度，形成新调色板，而位图数据不用动，就可以了。

5.3 真彩图转256色图

1.定义：真彩图能表示2^24种颜色，就是要从中挑选出256种颜色。

2.做法：

1)准备长度为4096的数组——用于存储4096种颜色的信息；

2）统计这4096种颜色在图中的使用频率。对图中的每一个象素，取RGB的最高四位，拼成一个12位的整数，该整数值对应的数组元素加1

3）排除数组值为0的元素；

4）根据数组值从大到小排序；

5）取前256种颜色的数组信息，作为调色板上的256种颜色；

6）将图像内容数据改写为调色板的索引值。对图中每个像素取R,G,B的高4位，拼成一个12位整数，到调色板中查找，如果存在，则填入对应的索引值；如果不存在，则利用最小平方误差在调色板中查找替换颜色的索引值。

5.4 对比度扩展

1. 低对比度：即灰度都挤在一起，没有拉开。假设有一幅图，由于成象时光照不足，使得整幅图偏暗(例如，灰度范围从063)；或者成象时光照过强，使得整幅图偏亮(例如，灰度范围从200255)

2. 灰度扩展：把你所感性趣的灰度范围拉开，使得该范围内的象素，亮的越亮，暗的越暗。

3. 做法：根据以下公式计算出新的灰度值：

gold表示原图的灰度值，gnew表示gold经过对比度扩展后得到了新的灰度值。g1oldg2old表示原图中要进行对比度扩展的范围，g1newg2new表示对应的新值。

a=(255-b(g2old-g1old))/(255-(g2old-g1old))

5.5 削波

1. 定义：是对比度扩展的特例，即a=c=0

2. 做法：只要给出g1oldg2old两个值，运用方程：b(g2old-g1old)=255计算出b值，并带入上节的公式中求得新图的灰度值即可。

5.6 阈值化

1. 定义：是削波的特例，即g1old=g2old

2. 做法：阈值就象个门槛，比它大就是白，比它小就是黑。

3. 作用：是一种常用的将图像转换成黑白二值图的方法。

5.7 灰度窗口变换

1 .定义：灰度窗口变换是将某一区间的灰度级和其它部分(背景)分开。

2. 种类：

1）清除背景：把不在灰度窗口范围内的象素都赋值为0，在灰度窗口范围内的象素都赋值为255，这也能实现灰度图的二值化；

2）保留背景：把不在灰度窗口范围内的象素保留原灰度值，在灰度窗口范围内的象素都赋值为255

3. 应用领域：电影特技处理（例如：“蓝幕”技术）。

5.8 灰度直方图统计

1.定义：用来统计图像灰度分布情况。，图中的横坐标表示灰度值，纵坐标表示该灰度值出现的次数(频率)

5.9 灰度直方图均衡化

1. 直方图修正，就是通过一个灰度映射函数Gnew=F(Gold)，将原灰度直方图改造成你所希望的直方图。

2. 直方图均衡化是一种最常用的直方图修正。它是把给定图象的直方图分布改造成均匀直方图分布。直观地讲，直方图均衡化导致图象的对比度增加。//？？感觉像降低对比度。

3. 做法：

1用一个数组s记录Pi分布的概率，即灰度i出现的次数与总的点数之比；

2i1开始，令s[i]=s[i]+s[i-1]

3）用一个数组L记录新的调色板索引值，即令L[i]=s[i]×(10-1)

4）计算新调色板的灰度值。

for (i = 0; i < EquaScale; i++) {

Gray=(int)(i*255.0/(EquaScale-1));   //？？超级不理解为什么是这样算的。

… …

5）通过数组L结果，调整图像实际数据内的调色板索引值。

终于找到自己感兴趣图像处理出入了，嘻嘻，就是做电影特效处理！真的很帅也，有时间去找点这方面的资料看看，加油~

2014-01-11 18:12:18 iAm333 阅读数 15543
• ###### Matplotlib 数据分析可视化

数据分析三剑客，NumPy、Pandas、Matplotlib，本课程是对Matplotlib的讲解，Matplotlib可以是分析的数据可视化，可以更直观的查看数据分析的结果，本课程独辟蹊径，不光教大家如何绘图，例如：饼图、柱状图、条形图、直方图等，而且深入剖析的Matplotlib的绘图原理，例如：如何操作图片，如何加载本地数据等。

15303 人正在学习 去看看 郭宏志

dx(i,j) = I(i+1,j) - I(i,j);
dy(i,j) = I(i,j+1) - I(i,j);

Hog介绍

（1）主要思想：
在一副图像中，局部目标的表象和形状（appearance and shape）能够被梯度或边缘的方向密度分布很好地描述。（本质：梯度的统计信息，而梯度主要存在于边缘的地方）。
（2）具体的实现方法是：
首先将图像分成小的连通区域，我们把它叫细胞单元。然后采集细胞单元中各像素点的梯度的或边缘的方向直方图。最后把这些直方图组合起来就可以构成特征描述器。
（3）提高性能：
把这些局部直方图在图像的更大的范围内（我们把它叫区间或block）进行对比度归一化（contrast-normalized），所采用的方法是：先计算各直方图在这个区间（block）中的密度，然后根据这个密度对区间中的各个细胞单元做归一化。通过这个归一化后，能对光照变化和阴影获得更好的效果。
（4）优点：
与其他的特征描述方法相比，HOG有很多优点。首先，由于HOG是在图像的局部方格单元上操作，所以它对图像几何的和光学的形变都能保持很好的不变性，这两种形变只会出现在更大的空间领域上。其次，在粗的空域抽样、精细的方向抽样以及较强的局部光学归一化等条件下，只要行人大体上能够保持直立的姿势，可以容许行人有一些细微的肢体动作，这些细微的动作可以被忽略而不影响检测效果。因此HOG特征是特别适合于做图像中的人体检测的。

Hog算法的实现过程：

HOG特征提取方法就是将一个image（你要检测的目标或者扫描窗口）：
1）灰度化（将图像看做一个x,y,z（灰度）的三维图像）；
2）采用Gamma校正法对输入图像进行颜色空间的标准化（归一化）；目的是调节图像的对比度，降低图像局部的阴影和光照变化所造成的影响，同时可以抑制噪音的干扰；
 注：许多特征检测的第一步都是要进行图像的预处理，如归一化颜色值和gamma值，但如Dalal和Triggs指出的那样，HOG描述子可以省略这个步骤，因为它其中的描述子归一化处理能达到同样的效果。图像预处理对最终效果的贡献微薄。所以第一步就是计算梯度值。最通常用的方法就是简单的应用一个一维的离散的梯度模版分别应用在水平和垂直方向上去。可以使用如下的卷积核进行卷积： [-1, 0, 1]{ and }[-1, 0, 1]^T Dalal和Triggs也测试了其他更加复杂的卷积核，例如3x3的Sobel卷积核(Sobel算子)和斜角卷积核，但是这些卷积核在行人检测的实验中表现的都很差。他们还用高斯模糊进行预处理，但是在实际运用中没有模糊反而会更好。
3）计算图像每个像素的梯度（包括大小和方向）；主要是为了捕获轮廓信息，同时进一步弱化光照的干扰。

4）将图像划分成小cells（例如6*6像素/cell）；
5）统计每个cell的梯度直方图（不同梯度的个数），即可形成每个cell的descriptor；

6）将每几个cell组成一个block（例如3*3个cell/block），一个block内所有cell的特征descriptor串联起来便得到该block的HOG特征descriptor。这些区间是互有重叠的，这就意味着：每一个单元格的特征会以不同的结果多次出现在最后的特征向量中。我们将归一化之后的块描述符（向量）就称之为HOG描述符。

cell大小如下：

cell默认大小是8*8.
7）将图像image内的所有block的HOG特征descriptor串联起来就可以得到该image（你要检测的目标）的HOG特征descriptor了。这个就是最终的可供分类使用的特征向量了。

Dalal提出的Hog特征提取的过程：把样本图像分割为若干个像素的单元（cell），把梯度方向平均划分为9个区间（bin），在每个单元里面对所有像素的梯度方向在各个方向区间进行直方图统计，得到一个9维的特征向量，每相邻的4个单元构成一个块（block），把一个块内的特征向量联起来得到36维的特征向量，用块对样本图像进行扫描，扫描步长为一个单元。最后将所有块的特征串联起来，就得到了人体的特征。例如，对于64*128的图像而言，每16*16的像素组成一个cell，每2*2个cell组成一个块，因为每个cell有9个特征，所以每个块内有4*9=36个特征，以8个像素为步长，那么，水平方向将有7个扫描窗口，垂直方向将有15个扫描窗口。也就是说，64*128的图片，总共有36*7*15=3780个特征。