基于MATLAB的数字图像处理之直方图处理
2014-07-17 14:51
726 查看
最近看了冈萨雷斯的《数字图像处理》第三章直方图处理那块,感觉还是自己编编程写个总结学习效率高一点。
所谓直方图就是以灰度级为横轴,以该灰度出现的频率为纵轴绘制的一张图片。
先把要处理的图片贴上来:
先用imread把图片读进去:I=imread('3.jpg');
再转化为灰度图片:I=rgb2gray(I);
用imshow(I)看看效果:
r=zeros(1,256); %创建一个下标从0到255的数组
for i=0:255 r(i+1)=length(find(I==i)); end%每个灰度级出现的像素数,注意下标不能为0
%find 函数返回所有满足条件的元素的下标,length求数组的长度。
[m,n]=size(I);
NUM=m*n;%总像素数
p=r/num;%p是每个灰度级出现的频率
%下面进行作图
bar(0:255,p)
%求s(k)
s=zeros(1,256);
for k=1:256
for j=1:k
s(k)=s(k)+p(j);
end
end
为什么这种累加运算会“均衡化”呢?
s(k)是r(k)的一个变化,但是,s(k)与r(k)没有直接关系,是对应灰度级概率的累加:
效果如下:
subplot(2,1,1);bar(0:255,r);subplot(2,2,1);bar(0:255,s);
但是s(k)的取值范围是0~1啊,所以要把它变回灰度值:
s=round(s*256+0.5);%round是就近取整,加上0.5之后就是向上取整了。
现在s是新的“加权”的灰度级:
Columns 1 through 17
1 1 1 1 1 1 1 1 2 5 12 17 22 29 36 42 48
Columns 18 through 34
52 56 60 64 68 73 76 79 81 84 87 89 91 92 94 95 97
Columns 35 through 51
98 98 99 99 100 100 101 101 101 101 102 102 102 102 102 102 103
Columns 52 through 68
103 103 103 103 103 103 104 104 104 104 104 104 105 105 105 105 105
Columns 69 through 85
105 106 106 106 106 106 106 107 107 107 107 107 107 108 108 108 108
Columns 86 through 102
108 109 109 109 109 110 110 110 111 111 111 111 112 112 112 113 113
Columns 103 through 119
113 113 114 114 114 115 115 115 116 116 116 117 117 117 118 118 118
Columns 120 through 136
119 119 119 120 120 120 121 121 121 122 122 123 123 123 124 124 125
Columns 137 through 153
125 126 126 126 127 127 128 128 128 129 129 129 130 130 131 131 131
Columns 154 through 170
132 132 132 133 133 133 134 134 134 135 135 136 136 136 137 137 137
Columns 171 through 187
138 138 138 139 139 139 140 140 140 141 141 141 142 142 142 143 143
Columns 188 through 204
143 143 144 144 144 145 145 145 146 146 146 146 147 147 147 147 148
Columns 205 through 221
148 148 148 149 149 149 149 150 150 150 150 151 151 151 151 152 152
Columns 222 through 238
152 152 153 153 153 153 154 154 154 154 155 155 155 155 156 156 156
Columns 239 through 255
156 157 157 157 158 158 158 159 159 159 160 160 161 162 162 163 164
Column 256
257
可以看出有些“不重要的”灰度级没有出现,而“重要的”灰度级则重复出现。
for i=1:256 P2(i)=sum(p(find(s==i)));
%P2(i)是新的概率,是“加权”灰度级等于“自然”灰度级的概率之和。
令i=159,则find(s==i)返回246,247,248.则P2(159)=p(246)+p(247)+p(248)
对每一个“自然”灰度,找到与它相等的“加权”灰度的下标,把原图对应的概率加起来。
即:求每一个“加权”灰度对应的概率。
像极了《概率论与数理统计》里头的求函数的概率密度有木有!!
就是:已知x,p(x),y=f(x),求p(y)一类题。
均衡化以后的直方图:
Q=I;
for i=0:255 Q(find(I==i))=s(i+1);%对每一级灰度,在原图上找到对应的像素点,用“加权”灰度替换原有的灰度。
end
看看效果吧!
imshow(Q);
哇啊啊,好像处理坏了,怎么这个效果啊,本人菜鸟一只,求大神指点!
匿了。。。
所谓直方图就是以灰度级为横轴,以该灰度出现的频率为纵轴绘制的一张图片。
先把要处理的图片贴上来:
先用imread把图片读进去:I=imread('3.jpg');
再转化为灰度图片:I=rgb2gray(I);
用imshow(I)看看效果:
r=zeros(1,256); %创建一个下标从0到255的数组
for i=0:255 r(i+1)=length(find(I==i)); end%每个灰度级出现的像素数,注意下标不能为0
%find 函数返回所有满足条件的元素的下标,length求数组的长度。
[m,n]=size(I);
NUM=m*n;%总像素数
p=r/num;%p是每个灰度级出现的频率
%下面进行作图
bar(0:255,p)
%求s(k)
s=zeros(1,256);
for k=1:256
for j=1:k
s(k)=s(k)+p(j);
end
end
为什么这种累加运算会“均衡化”呢?
s(k)是r(k)的一个变化,但是,s(k)与r(k)没有直接关系,是对应灰度级概率的累加:
效果如下:
subplot(2,1,1);bar(0:255,r);subplot(2,2,1);bar(0:255,s);
但是s(k)的取值范围是0~1啊,所以要把它变回灰度值:
s=round(s*256+0.5);%round是就近取整,加上0.5之后就是向上取整了。
现在s是新的“加权”的灰度级:
Columns 1 through 17
1 1 1 1 1 1 1 1 2 5 12 17 22 29 36 42 48
Columns 18 through 34
52 56 60 64 68 73 76 79 81 84 87 89 91 92 94 95 97
Columns 35 through 51
98 98 99 99 100 100 101 101 101 101 102 102 102 102 102 102 103
Columns 52 through 68
103 103 103 103 103 103 104 104 104 104 104 104 105 105 105 105 105
Columns 69 through 85
105 106 106 106 106 106 106 107 107 107 107 107 107 108 108 108 108
Columns 86 through 102
108 109 109 109 109 110 110 110 111 111 111 111 112 112 112 113 113
Columns 103 through 119
113 113 114 114 114 115 115 115 116 116 116 117 117 117 118 118 118
Columns 120 through 136
119 119 119 120 120 120 121 121 121 122 122 123 123 123 124 124 125
Columns 137 through 153
125 126 126 126 127 127 128 128 128 129 129 129 130 130 131 131 131
Columns 154 through 170
132 132 132 133 133 133 134 134 134 135 135 136 136 136 137 137 137
Columns 171 through 187
138 138 138 139 139 139 140 140 140 141 141 141 142 142 142 143 143
Columns 188 through 204
143 143 144 144 144 145 145 145 146 146 146 146 147 147 147 147 148
Columns 205 through 221
148 148 148 149 149 149 149 150 150 150 150 151 151 151 151 152 152
Columns 222 through 238
152 152 153 153 153 153 154 154 154 154 155 155 155 155 156 156 156
Columns 239 through 255
156 157 157 157 158 158 158 159 159 159 160 160 161 162 162 163 164
Column 256
257
可以看出有些“不重要的”灰度级没有出现,而“重要的”灰度级则重复出现。
for i=1:256 P2(i)=sum(p(find(s==i)));
%P2(i)是新的概率,是“加权”灰度级等于“自然”灰度级的概率之和。
令i=159,则find(s==i)返回246,247,248.则P2(159)=p(246)+p(247)+p(248)
对每一个“自然”灰度,找到与它相等的“加权”灰度的下标,把原图对应的概率加起来。
即:求每一个“加权”灰度对应的概率。
像极了《概率论与数理统计》里头的求函数的概率密度有木有!!
就是:已知x,p(x),y=f(x),求p(y)一类题。
均衡化以后的直方图:
Q=I;
for i=0:255 Q(find(I==i))=s(i+1);%对每一级灰度,在原图上找到对应的像素点,用“加权”灰度替换原有的灰度。
end
看看效果吧!
imshow(Q);
哇啊啊,好像处理坏了,怎么这个效果啊,本人菜鸟一只,求大神指点!
匿了。。。
相关文章推荐
- 直方图和直方图均衡的Matlab完整程序(数字图像处理)
- 基于matlab的数字图像处理GUI设计
- 数字图像处理:基于MATLAB的车牌识别项目 标签: 图像处理matlab算法 2017-06-24 09:17 98人阅读 评论(0)
- matlab 数字图像处理 图像增强 空域 直方图修正
- 数字图像处理:基于MATLAB的车牌识别项目
- 基于标准C语言的数字图像处理基本框架
- 基于MATLAB的储粮害虫图像处理方法
- OpenCV数字图像处理五:显示直方图
- 基于FPGA的图像处理(四)--Matlab Language supported by Mcode
- 基于Matlab的图像分块处理
- 【MATLAB图像处理2】 直方图的均衡化(附源码)
- 基于FPGA的图像处理(四)--Matlab Language supported by Mcode
- 基于数字图像处理的车牌定位和分割的研究 -- 开题报告
- 基于标准C语言的数字图像处理基本框架3
- 【数字图像处理】计算输入图像(jpg、bmp等)的LBP纹理图、纹理直方图及纹理图各像素的直方图并显示
- 红外图像处理之直方图均衡的matlab源码与效果验证
- 基于matlab的GUI图像处理
- 【数字图像处理】图像可视化对数增强 直方图及其均衡化
- 基于标准C语言的数字图像处理基本框架
- Matlab在数字图像处理中的应用