作者costbook (Sissy's mate)
看板Programming
标题计算直方图均化 转换函数 & 反转换函数 的问题
时间Fri Oct 31 18:29:22 2008
题目:求灰阶图片直方图均化的转换与反转换函数,
并且实际对一个图片做处理
遇到的问题:反转换(应用於直方图等化)不成功
问题详细描述:
转换函数的部份我「应该」写出来了,
可是反转换函数怎麽测试就是不对,
画出来的转换函数曲线图是错的,
反转换的图片也错的
我的想法是...
当初这个灰阶值在转换曲线被转换为多少,
那麽在反转换函数中,反过来记录就对了
然後就可以求得转换函数Hc和反转换函数Hcp,
Hc和Hcp都是一维阵列,就是要转换数值的对应表格
如果要做直方图均化,
写法就是:
img(i,j) = Hc( img(i,j)+1 )
如果要做img1等化到img2:
img(i,j) = Hcp2( Hc1(img(i,j)+1 )
测试的结果是,
自己对自己做等化,
也就是转换过去再转回来是ok的
(自己对自己做直方图等化是成功的)
如果是img1等化到img2...
结果是"差不多"对,
因为...
等化後img1的灰阶分布累加图大约等於img2
可是img1的某一个灰阶度的像素数量会飙高...
导致其他灰阶值的像素都降低了
(不过img1等化後的灰阶分布直方图,
和img2的很像,算是半成功吧)
以下是求转换函数的程式码,
(程式是matlab)
==================================================
function [Hc,Hcp]=getHc(imgfile)
% 读取图片和相关资讯的部份
info=imfinfo(imgfile);
img=imread(imgfile);
try
g=rgb2gray(img);
catch
g=img;
end
tol=info.Width*info.Height;
scale=2^info.BitDepth;
% 真正开始计算的部份
% Hc=一维阵列,灰阶转换函数的数值
Hcp=zeros(1,scale); % 反转换函数
% 取得图片的灰阶分布直方图
Hc=getGLH(imgfile);
% 灰阶值/总像数数量 (每个灰阶像素的平均数量)
GLIV=scale/tol;
% 计算灰阶分布直方图的累加数值
for i=2:scale
Hc(i)=Hc(i)+Hc(i-1);
end
% 计算直方图均化转换函数
for i=1:scale
newG=uint8(Hc(i)*GLIV);
Hc(i)=newG;
% 顺便纪录反转换函数
Hcp(newG+1)=i;
end
==================================================
用下面程式码可以画出
转换与反转换函数的曲线图
[a,b]=getHc('m.bmp');
subplot(1,2,1)
plot(a)
subplot(1,2,2)
plot(b)
不知道我是逻辑错误,
还是程式写错
还是两个都错了?
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 203.68.92.156
※ costbook:转录至看板 MATLAB 11/01 09:07