EDA365电子论坛网
标题:
MATLAB 直方图
[打印本页]
作者:
ulppknot
时间:
2021-8-31 13:45
标题:
MATLAB 直方图
* |/ l/ M3 e- V
(一)
/ \5 D1 h# W& D& i! k; Q
3 a- S9 K$ H7 L( [; ?' d
灰度的线性变换。
# \5 L3 t j, e8 s7 A" _- r
8 [% D! k* y/ T' {
改变图像的对比度是对直方图的缩放与平移。改变图像的亮度是平移直方图,反向是将直方图镜像。
' w7 L7 ~4 K' ~3 ^( n* s
0 |4 C7 G7 T) c7 N: T3 X0 Y
I = imread('coins.png'); % 读入原图像 I = im2double(I); % 转换数据类型为double [M,N] = size(I); % 计算图像面积 figure(1); % 打开新窗口 imshow(I); % 显示原图像 title('原图像'); figure(2); % 打开新窗口 [H,x] = imhist(I, 64); % 计算64个小区间的灰度直方图 stem(x, (H/M/N), '.'); % 显示原图像的直方图 title('原图像'); % 增加对比度 Fa = 2; Fb = -55; O = Fa .* I + Fb/255; figure(3); subplot(2,2,1); imshow(O); title('Fa = 2 Fb = -55 增加对比度'); figure(4); subplot(2,2,1); [H,x] = imhist(O, 64); stem(x, (H/M/N), '.'); title('Fa = 2 Fb = -55 增加对比度'); % 减小对比度 Fa = 0.5; Fb = -55; O = Fa .* I + Fb/255; figure(3); subplot(2,2,2); imshow(O); title('Fa = 0.5 Fb = -55 减小对比度'); figure(4); subplot(2,2,2); [H,x] = imhist(O, 64); stem(x, (H/M/N), '.'); title('Fa = 0.5 Fb = -55 减小对比度'); % 线性增加亮度 Fa = 1; Fb = 55; O = Fa .* I + Fb/255; figure(3); subplot(2,2,3); imshow(O); title('Fa = 1 Fb = 55 线性平移增加亮度'); figure(4); subplot(2,2,3); [H,x] = imhist(O, 64); stem(x, (H/M/N), '.'); title('Fa = 1 Fb = 55 线性平移增加亮度'); % 反相显示 Fa = -1; Fb = 255; O = Fa .* I + Fb/255; figure(3); subplot(2,2,4); imshow(O); title('Fa = -1 Fb = 255 反相显示'); figure(4); subplot(2,2,4); [H,x] = imhist(O, 64); stem(x, (H/M/N), '.'); title('Fa = -1 Fb = 255 反相显示');
% A; Y% J$ E1 V3 @' h7 }' y
2 [# z. D! P: ^1 |3 \
$ p- h; u' \( G$ B8 _
" X. p ~- _5 P0 ^1 s# q6 M" t, F. A
, G- J$ k# y0 Y
(二)
3 o; B' y8 V6 p/ v
9 b1 j7 t2 |: ?% ~; _8 q, [ K
伽马变换/指数变换/幂次变换/灰度非线性变换
( w9 Q& y ]/ t* v4 e p
- v8 i: g8 Z/ `8 S" L+ c8 x9 q
不仅改变图像的对比度,还能够增强细节。
5 C( z8 ?4 p W/ r3 }) H
' @* B3 L# [. E) }
I = imread('pout.tif'); %读入原图像 % Gamma取0.75 subplot(1,3,1); imshow(imadjust(I, [ ], [ ], 0.75)); title('Gamma 0.75'); % Gamma取1 subplot(1,3,2); imshow(imadjust(I, [ ], [ ], 1)); title('Gamma 1'); % Gamma取1.5 subplot(1,3,3); imshow(imadjust(I, [ ], [ ], 1.5)); title('Gamma 1.5'); figure; % Gamma取0.75 subplot(1,3,1); imhist(imadjust(I, [ ], [ ], 0.75)); title('Gamma 0.75'); % Gamma取1 subplot(1,3,2); imhist(imadjust(I, [ ], [ ], 1)); title('Gamma 1'); % Gamma取1.5 subplot(1,3,3); imhist(imadjust(I, [ ], [ ], 1.5)); title('Gamma 1.5');
+ g* j3 `* ?& \/ k
& R" E! j- b& A8 }$ m
7 S) F E, I5 t4 T& ]" S6 T& L: n3 Y
+ H1 H" U/ }6 v
& F, r5 N2 v) c! [0 b
(三)
+ p# M; ^% t3 B& `
) a* M% X% I1 u) M% }8 Y
阈值灰度变换
3 f1 w8 z1 L- ]: X+ I3 m# ~7 T9 y/ Y
2 p) k7 L6 \3 y1 a# r/ e! s; Y Q
阈值化,二值化,从复杂的背景中提取感兴趣的部分。
: ]0 W! o+ B) S2 D. y7 ]
% I) P/ c0 J6 A, q! O& B( _
: A {$ b* Q% ]4 U* z
(四)
: x# ]/ Z3 v1 e+ u+ M: U) s
1 d h, l3 M% h3 O {4 y9 n$ m, m* C
分段线性变换
$ F+ V" j \& l" t0 C- O
% e; p1 V3 ?, d) r
function out = imgrayscaling(varargin) % IMGRAYSCALING 执行灰度拉伸功能 % 语法: % out = imgrayscaling(I, [x1,x2], [y1,y2]); % out = imgrayscaling(X, map, [x1,x2], [y1,y2]); % out = imgrayscaling(RGB, [x1,x2], [y1,y2]); % 这个函数提供灰度拉伸功能,输入图像应当是灰度图像,但如果提供的不是灰度 % 图像的话,函数会自动将图像转化为灰度形式。x1,x2,y1,y2应当使用双精度 % 类型存储,图像矩阵可以使用任何MATLAB支持的类型存储。 [A, map, x1 , x2, y1, y2] = parse_inputs(varargin{:}); % 计算输入图像A中数据类型对应的取值范围 range = getrangefromclass(A); range = range(2); % 如果输入图像不是灰度图,则需要执行转换 if ndims(A)==3,% A矩阵为3维,RGB图像 A = rgb2gray(A); elseif ~isempty(map),% MAP变量为非空,索引图像 A = ind2gray(A,map); end % 对灰度图像则不需要转换 % 读取原始图像的大小并初始化输出图像 [M,N] = size(A); I = im2double(A); % 将输入图像转换为双精度类型 out = zeros(M,N); % 主体部分,双级嵌套循环和选择结构 for i=1:M for j=1:N if I(i,j)<x1 out(i,j) = y1 * I(i,j) / x1; elseif I(i,j)>x2 out(i,j) = (I(i,j)-x2)*(range-y2)/(range-x2) + y2; else out(i,j) = (I(i,j)-x1)*(y2-y1)/(x2-x1) + y1; end end end % 将输出图像的格式转化为与输入图像相同 if isa(A, 'uint8') % uint8 out = im2uint8(out); elseif isa(A, 'uint16') out = im2uint16(out); % 其它情况,输出双精度类型的图像 end % 输出: if nargout==0 % 如果没有提供参数接受返回值 imshow(out); return; end %----------------------------------------------------------------------------- function [A, map, x1, x2, y1, y2] = parse_inputs(varargin); % 这就是用来分析输入参数个数和有效性的函数parse_inputs % A 输入图像,RGB图 (3D), 灰度图 (2D), 或者索引图 (X) % map 索引图调色板 (:,3) % [x1,x2] 参数组 1,曲线中两个转折点的横坐标 % [y1,y2] 参数组 2,曲线中两个转折点的纵坐标 % 首先建立一个空的map变量,以免后面调用isempty(map)时出错 map = []; % IPTCHECKNARGIN(LOW,HIGH,NUM_INPUTS,FUNC_NAME) 检查输入参数的个数是否 % 符合要求,即NUM_INPUTS中包含的输入变量个数是否在LOW和HIGH所指定的范围 % 内。如果不在范围内,则此函数给出一个格式化的错误信息。 iptchecknargin(3,4,nargin,mfilename); % IPTCHECKINPUT(A,CLASSES,ATTRIBUTES,FUNC_NAME,VAR_NAME, ARG_POS) 检查给定 % 矩阵A中的元素是否属于给定的类型列表。如果存在元素不属于给定的类型,则给出 % 一个格式化的错误信息。 iptcheckinput(varargin{1},... {'uint8','uint16','int16','double'}, ... {'real', 'nonsparse'},mfilename,'I, X or RGB',1); switch nargin case 3 % 可能是imgrayscaling(I, [x1,x2], [y1,y2]) 或 imgrayscaling(RGB, [x1,x2], [y1,y2]) A = varargin{1}; x1 = varargin{2}(1); x2 = varargin{2}(2); y1 = varargin{3}(1); y2 = varargin{3}(2); case 4 A = varargin{1};% imgrayscaling(X, map, [x1,x2], [y1,y2]) map = varargin{2}; x1 = varargin{2}(1); x2 = varargin{2}(2); y1 = varargin{3}(1); y2 = varargin{3}(2); end % 检测输入参数的有效性 % 检查RGB数组 if (ndims(A)==3) && (size(A,3)~=3) msg = sprintf('%s: 真彩×××像应当使用一个M-N-3维度的数组', ... upper(mfilename)); eid = sprintf('Images:%s:trueColorRgbImageMustBeMbyNby3',mfilename); error(eid,'%s',msg); end if ~isempty(map) % 检查调色板 if (size(map,2) ~= 3) || ndims(map)>2 msg1 = sprintf('%s: 输入的调色板应当是一个矩阵', ... upper(mfilename)); msg2 = '并拥有三列'; eid = sprintf('Images:%s:inColormapMustBe2Dwith3Cols',mfilename); error(eid,'%s %s',msg1,msg2); elseif (min(map(:))<0) || (max(map(:))>1) msg1 = sprintf('%s: 调色板中各个分量的强度 ',upper(mfilename)); msg2 = '应当在0和1之间'; eid = sprintf('Images:%s:colormapValsMustBe0to1',mfilename); error(eid,'%s %s',msg1,msg2); end end % 将int16类型的矩阵转换成uint16类型 if isa(A,'int16') A = int16touint16(A); end
3 L' o$ j F# _2 u7 x. W+ l+ g. A
5 T; ^9 U' d) U$ m
: e5 S, S- n: d4 ~% a
4 o$ {9 H7 k& |6 C( l' w
J1=imgrayscaling(I,[0.3,0.7],[0.15,0.85]); >> figure ,imshow(J1,[]);
) V* z* [% T) h4 ]: t5 S7 K
- f1 {/ K8 h$ `# V8 E
- n( U# c8 t0 S1 z T$ |
# C5 d, B, v$ v) b% g
y4 y9 x, Z7 H7 Y0 I! K+ U
(五)
0 e/ _/ M1 E* q3 @6 S; c) o5 [3 `7 O8 S! B
8 }1 [5 h8 q# _. N8 K% j3 G
均衡化
1 A/ A1 q: k: b# m5 p% Q3 F
1 ^4 V4 _! U; e+ y S6 l
直方图均衡化,灰度级越均匀分布,则图像的对比度越高,易进行判读。
$ {/ H$ ^; S* i {( L
* K" J9 s( Q, ~( Z
[J,T]=histeq(I);
0 A2 t. X/ G- ^
* B7 M. n) \# x# e# D
; _& H% K7 l1 Q4 Z) T7 c
(六)
4 \% I3 Q1 N! r9 L
V* [) H" Q& E, K. f0 ]6 Y
规定化
/ X2 d# U3 w$ P. s
/ U4 F/ g; ^" e9 S
相似拟合过程 ,均衡化逆过程。
作者:
CCxiaom
时间:
2021-8-31 14:51
改变图像的对比度是对直方图的缩放与平移
作者:
NNNei256
时间:
2021-8-31 14:52
伽马变换/指数变换/幂次变换/灰度非线性变换不仅改变图像的对比度,还能够增强细节
作者:
Enest13
时间:
2021-8-31 15:42
直方图均衡化,灰度级越均匀分布,则图像的对比度越高,易进行判读
欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/)
Powered by Discuz! X3.2