找回密码
 注册
关于网站域名变更的通知
查看: 1057|回复: 3
打印 上一主题 下一主题

MATLAB 直方图

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2021-8-31 13:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
4 V3 w- p; ?+ r; y
     (一), B4 c7 N9 ]/ X/ U' ^
7 I4 z  f# n: m# U2 @/ w! W9 x
      灰度的线性变换。8 T/ n' ~: h. x- b& _+ J

4 {/ K0 i/ J6 ?  B7 Q9 h* |      改变图像的对比度是对直方图的缩放与平移。改变图像的亮度是平移直方图,反向是将直方图镜像。5 T0 e' a5 ~9 d7 A

1 ?: Z" R+ q6 ?9 X
  • 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 反相显示');$ ~. R3 @& Y: n
$ Z* I, y9 H% T" {( v- I

+ G& e; s; {8 w- [1 g
, a& n  X+ }5 Z% [
- f5 t# ?5 q0 ^3 g" G/ a$ K      (二)
; g4 a# X3 T" o8 y, ?, _' t' K
- A" j4 Q1 t5 x7 L0 N% J      伽马变换/指数变换/幂次变换/灰度非线性变换+ h& @, G) R- t% F7 k

% z4 n! ~' V" \  ^$ F0 n) v     不仅改变图像的对比度,还能够增强细节。( r; U) L' ~! s3 _8 H, G1 k$ ]" Y4 t

* f# r0 Y$ Y# B9 Q8 _0 a7 z: u
  • 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');3 j/ o, Y+ v& e6 d7 C

0 d) D( g1 u9 B' n6 L  m& S; t  }2 K( G  R$ ]( D
' O  c$ v! _8 I; j1 o
- S% S& S: z  j& X* f
      (三)% ?" _0 I" ]4 R' Z' k9 Q/ D+ b

4 R5 S% P5 K( r0 a2 K; v4 M       阈值灰度变换
9 d7 Z7 n9 C$ v5 G/ t' l: }
9 Q2 h2 R) I, M0 ?9 Z5 h       阈值化,二值化,从复杂的背景中提取感兴趣的部分。; g* K0 Q. I# b- F

7 }/ X5 g7 |! N3 m. G, q
4 L; [0 z1 b& p* I  L       (四)
+ T: S7 L) D  f# H7 T/ M( [! p: ^  `; t- p; s9 H7 U
        分段线性变换
& h& |+ z1 m, \5 y; M, s$ z+ z  a& r  ~8 \& i# b) x
  • 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); end2 o0 k2 H( q3 }% l# G- F: Y+ r
/ P8 @, [: B7 N
1 B4 `" \  I/ f; S  P
; g* s$ h9 `5 ^0 L& v3 F9 c
  • J1=imgrayscaling(I,[0.3,0.7],[0.15,0.85]); >> figure ,imshow(J1,[]);7 T4 m7 ]  n8 u$ ~* R+ r

- |$ Z& S" m) Z) R! J  K5 [8 ^4 f+ b' W5 L+ t9 ~4 o* J
  0 I# _; J1 s! n6 R+ E

# K5 p8 m* p4 L    (五)- O8 S" N8 P+ F' q

( ^+ M. ^% w" f0 m2 s8 d/ h' ^    均衡化+ R, j2 C% c6 Y1 q8 N2 E+ |6 w! Y

' s# P. j" i3 ^$ d( @# d$ }: }    直方图均衡化,灰度级越均匀分布,则图像的对比度越高,易进行判读。
3 t* r8 t* d# ~- F! ^* ~- @& H3 V
$ U" S, H/ T+ l8 v, E3 o: L: l     [J,T]=histeq(I);% `& c* K# H2 E& L- t3 V! O+ P

3 V% e- Y  c: m/ s$ w1 i8 T7 d2 G+ \: P; ?9 |- G
     (六)& p- Q) \. r' Y) H% Z/ [
! g, S+ G  }' E5 Q) g
     规定化
5 ?, t- [! A  q' x; ]$ [( K& H+ E. ^& q! e+ t0 M
     相似拟合过程  ,均衡化逆过程。

该用户从未签到

2#
发表于 2021-8-31 14:51 | 只看该作者
改变图像的对比度是对直方图的缩放与平移

该用户从未签到

3#
发表于 2021-8-31 14:52 | 只看该作者
伽马变换/指数变换/幂次变换/灰度非线性变换不仅改变图像的对比度,还能够增强细节

该用户从未签到

4#
发表于 2021-8-31 15:42 | 只看该作者
直方图均衡化,灰度级越均匀分布,则图像的对比度越高,易进行判读
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-23 22:50 , Processed in 0.140625 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表