Matlab数字图像处理基础【3】
来源:互联网 发布:淘宝网液晶电视机 编辑:程序博客网 时间:2024/04/29 08:56
clc;
clear;
A = imread('flower_gray.jpg');
figure(1)
imshow(A);
A1 = imadjust(A, [], [], 0.2);
A2 = imadjust(A, [0.5;0.75], [0.1;0.2], 1);
figure(2)
imshow(A1);
figure(3)
imshow(A2);
clc;
clear;
A =imread('flower_gray.jpg');
subplot(2,2,1);
imshow(A);
title('原图像');
x0 =0; y0 = 0;
x1 =75; y1 = 25;
x2 =180; y2 = 220;
x3 =255; y3 = 255;
subplot(2,2,2);
plot([x0,x1, x2, x3], [y0, y1, y2, y3]);
title('灰度映射关系');
k1 =(y1 - y0) / (x1 - x0);
b1 =y0 - k1 * x0;
k2 = (y2- y1) / (x2 - x1);
b2 =y1 - k2 * x1;
k3 =(y3 - y2) / (x3 - x2);
b3 =y3 - k3 * x3;
[m, n]= size(A);
A1 =double(A);
for i= 1:m
for j = 1:n
f = A1(i,j);
g(i,j) = 0;
if f < x1
g(i,j) = k1 * f + b1;
elseif f >= x1 && f <= x2
g(i,j) = k2 * f + b2;
else
g(i,j) = k3 * f + b3;
end
end
end
A2 =mat2gray(g);
subplot(2,2,3);
imshow(A2);
title('映射之后的图像');
严格一点来说,直方图均衡化和直方图规定化是不同的概念。histeq是用来做直方图均衡的。
直方图均衡化:Image1 = histeq(Image, hgram);
hgram是均衡化后的灰度级个数。
比如histeq(I, 16),就是希望均衡化后的直方图只有16个灰度级;
histeq(I, 64),就是希望均衡化后的直方图只有64个灰度级。
假设原始图像为256级,共有X个像素,现希望均衡化为N个灰度级,过程如下:
步骤1:计算原始图像I的累积函数A(g),其中g=[0,255]表示256个灰度级。
A(0)就是灰度级为0的元素个数;
A(1)就是灰度级为0和1的元素个数和;
A(2)就是灰度级为0、1和2的元素个数和;
...依次类推...;
A(255)就是X,即原始图像的总的像素个数。
步骤2:计算原始直方图和均衡化后直方图的映射关系g->G,即将原始图像中的灰度值g变成新的灰度值G。
这里,G=N*A(g)/X
步骤3:遍历原始图像I,依据步骤2中的映射关系,把所有像素点的灰度值变成新的灰度值,完毕。
显示直方图:
clc;
clear;
A = imread('flower_gray.jpg');
subplot(2,2,1);
imshow(A);
title('原图像');
subplot(2,2,2);
imhist(A);
title('原图像灰度直方图');
获取直方图和直方图均衡化:
clc;
clear;
A = imread('flower_gray.jpg');
subplot(2,2,1);
imshow(A);
title('原图像');
h = imhist(A);
v = h(1:10:256);
horz = 1:10:256;
subplot(2,2,2);
bar(horz, v);
axis([0 255 0 15000]);
set(gca,'xtick',[0:50:255]);
set(gca,'ytick',[0:2000:15000]);
title('原图像灰度直方图');
A1 =histeq(A, 256);
subplot(2,2,3);
imshow(A1);
title('直方图均衡化后的图像');
h1 = imhist(A1);
v1 =h1(1:10:256);
horz1= 1:10:256;
subplot(2,2,4);
bar(horz1,v1);
axis([0 255 0 15000]);
set(gca,'xtick',[0:50:255]);
set(gca,'ytick',[0:2000:15000]);
title('均衡化后的直方图');
3.2.2 自定义函数实现直方图均衡化
示例:
clc;
clear;
RGB = imread('flower_rgb.jpg'); %读取彩色图
subplot(1,3,1);
imshow(RGB);
title('彩色图');
I=rgb2gray(RGB); % 将彩色图转化为灰度图
subplot(1,3,2);
imshow(I);
title('灰度图');
[R, C] = size(I);
% 统计每个像素值出现次数
cnt = zeros(1, 256);
for i = 1 : R
for j = 1 : C
cnt(1, I(i, j) + 1) = cnt(1, I(i, j) + 1) + 1;
end
end
f = zeros(1, 256);
f = double(f); cnt = double(cnt);
% 统计每个像素值出现的概率,得到概率直方图
for i = 1 : 256
f(1, i) = cnt(1, i) / (R * C);
end
% 求累计概率,得到累计直方图
for i = 2 : 256
f(1, i) = f(1, i - 1) + f(1, i);
end
% 用f数组实现像素值[0, 255]的映射。
for i = 1 : 256
f(1, i) = f(1, i) * 255;
end
% 完成每个像素点的映射
I = double(I);
for i = 1 : R
for j = 1 : C
I(i, j) = f(1, I(i, j) + 1);
end
end
% 输出
I = uint8(I);
subplot(1,3,3);
imshow(I);
title('直方图均衡化');
- Matlab数字图像处理基础【3】
- Matlab数字图像处理基础
- 数字图像处理matlab基础操作
- Matlab数字图像处理基础【1】
- Matlab数字图像处理基础【2】
- Matlab数字图像处理基础【4】
- Matlab数字图像处理基础【5】
- Matlab数字图像处理基础【8】
- Matlab数字图像处理基础【9】
- Matlab数字图像处理基础【10】
- Matlab数字图像处理基础【11】
- Matlab数字图像处理基础【12】
- Matlab数字图像处理的基础
- matlab 最基础的数字图像处理
- matlab 最基础的数字图像处理 .
- Matlab数字图像处理基础:图像采样
- 数字图像处理MATLAB基础中的一些新发现
- matlab数字图像/视频处理基础 第一篇
- ADB使用以及常见问题解决
- 适配器Stack----deque/Vector做空间配置器实现
- 第39级台阶
- POJ2492 a bug's life并查集扩展
- 滑动解锁 蓝桥模拟赛
- Matlab数字图像处理基础【3】
- 使一个任务进入就绪态,OSEventTaskRdy()
- JAVA集合的运用
- FastJson
- Java字符串String:equals方法和==的区别
- JDBC(2)
- gcc选项含义:CFLAGS、CXXFLAGS、LDFLAGS与LIBS
- CAPL常见问题
- 内部类和外部类