您的位置:首页 > 编程语言 > MATLAB

基于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);



哇啊啊,好像处理坏了,怎么这个效果啊,本人菜鸟一只,求大神指点!

匿了。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: