前言
如果,如果你要做的是8位图直方图均衡化,别看了。前方左转查查histeq怎么用,挺简单的,另我个新手上路,不会用matlab,所以在这里记录下histeq怎么用,不看往下翻。
8位图 histeq函数
8位tif灰度图像图像
灰度图就很方便了,I是读取到的数组,用histeq将I做均衡化,用I1存储生成的数组,用figure显示出来
I = imread(‘xxx.tif’);
I1 = histeq(I);
figure,imshow(I1,[])
好的这里如果要存储的话,反正是8位的图像嘛,这里就直接用
imwrite(I1,'m.jpeg')
就可以了
8位bmp rgb图像
好的如果是8位的或者不知道多少位的bmp rgb图像的话,如果只是追求这个函数可以使用,那么,可以试试我这个方案
F=imread('D:\Project\直方图均衡\Pic\1.bmp');
F1=rgb2gray(F);
F2 = histeq(F1);
figure,imshow(F2,[])
其他操作同上
16位 raw文件读取
怎么读取找了半天,不重开一个文章了都记录在这吧
下面两行代码,把从fid读取到的数据存放到b这个数组里,[300,200]是文件大小,注,第一个参数一定要对,第二个无所谓。‘int16’是数据格式,8位的话就int8
fid=fopen('D:\Project\直方图均衡\Pic\0.Raw', 'r');
[b,count]=fread(fid,[300,200],'int16');
好的,另外你应该知道那个‘’单引号内部的是图像路径吧? 还有就是matlab左边的那个路径在的地方,被matlab视为根位置,对放在这个地方的文件不用前面的那一堆,可以直接写文件名,懂吧?
16位图 代码
不知道matlab代码怎么插入,用的lua脚本的格式凑合着看吧
function [img2] = a(img)
img1 = double(img);
[r,c] = size(img1);%获取图像的高r和宽c
%统计图像中每个灰度级i出现的次数存到count(1,i)里
count = zeros(1,65536);
for i=1:r
for j=1:c
count(1,img(i,j)+1) = count(1,img(i,j)+1)+1;
end
end
%统计图像中每个灰度级i出现的概率,存储到p(1,i)里
p = zeros(1,65536);
for i=1:65536
p(1,i) = count(1,i)/(r*c);
end
img2 = im2uint8(ones(r,c));%创建一个r * c大小的1矩阵
func_T = zeros(1,65536);%变换映射存储
p_sum = 0;
%求直方图均衡化的变换函数
for k = 1:65536
p_sum = p_sum + p(k);%求每个灰度级的概率之和
func_T(k) = 255*p_sum;%根据变换函数的公式求每一点k对应的映射值
end
func_T_z = round(func_T);%对变换函数进行取整,round 为四舍五入取整
%完成每个像素点的映射
for i = 0:255
findi = find(func_T_z==i);%找到灰度级为i的概率和
len = length(findi);
for j=1:len
findj = find(img==(findi(j)-1));%进行对应每个像素点的映射
img2(findj) = i;
end
end
end
不确定有没有bug,觉得有问题的千万指出....把这个保存成a.mat文件放在matlab目录里,就可以直接调用啦,传入数组是刚从raw里读出来的b。