【图像处理】金属器件高亮度图像处理
创始人
2025-05-29 23:40:50
0

金属器件高亮度图像处理

  • 一、RGB颜色空间向YCbCr空间转化
  • 二、归一化处理
  • 三、直方图均衡化
  • 四、分段线性变换

前言:在制作数据集时,发现对于金属器件的拍摄图像,或多或少存在一定高曝光问题,本文章针对此问题提供一种解决方式

一、RGB颜色空间向YCbCr空间转化

对一种颜色进行编码的方法统称为颜色空间最常用的表现彩色图像的颜色空间是 RGB 颜色空间。

在该颜色空间中,颜色被定义为由 R,G,B 3个分量组成。这 3 个分量都包含了亮度信息它们之间存在着很大的相关性,而这种相关性,加大了高光处理的难度。

这里用到的颜色空间 YCbCr 是亮度和色度分离的颜色空间 YUV的一种YUV 是被欧洲电视系统所采用的一种颜色编码方法,其中,Y 表示亮度, 和V表示的则是色度。

本算法选择 YCbCr 作为去除高光算法的基础,Y 代表图像的亮度信息,Cb 指蓝色色度分量,而 Cr 指红色色度分量Cb,该颜色空间将 RGB 分解成亮度空间。

	I = imread(filename);I_YUV = rgb2ycbcr(I);%% 显示Y通道图像figure;Y = I_YUV(:,:,1);% imhist(Y)imshow(Y);title("原图像");

结果图

在这里插入图片描述

二、归一化处理

归一化处理是为了使得函数的曲线更加清晰,也更容易计算。

    %% 归一化为[0 1]desiredMin = 0;     %想要的最小灰度desiredMax = 1;     %想要的最大灰度desiredRange = desiredMax - desiredMin;dblImageS1 = desiredRange*(double(Y) - originalMinValue) / originalRange+desiredMin;figure;imhist(dblImageS1);title('归一化直方图');

结果图

在这里插入图片描述

三、直方图均衡化

这里直方图均衡化使用了matlab自带的histeq,因为只对Y通道进行处理,所以相当于是对灰度值进行处理,均衡化效果也比较不错。

    %% 直方图均衡化% hist_img = hist_img(dblImageS1);subplot(143)% imhist(hist_img);J = histeq(dblImageS1);  %直方图均衡化I_YUV(:,:,1) = J;% imhist(J)imshow(J);title("均衡化图像")

结果图

在这里插入图片描述

可以看到,均衡化后的效果已经好很多了。

四、分段线性变换

分段的灰度拉伸可以更加灵活的控制输出灰度直方图的分布,可以有选择性的拉伸某段灰度区间,以改善输出图像。如果一副图像集中在较暗的区域而导致图像偏暗。

可以用灰度拉伸功能来扩展(斜率>1)物体的灰度区间以改善图像;同样,如果图像的灰度集中在较亮的区域而导致图像偏亮,也可以用灰度拉伸功能来压缩(斜率小于1)物体灰度区间以改善图像质量。

这里使用了自定义函数函数imgrayscaling
在这里插入图片描述

%%
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:Mfor j=1:Nif I(i,j)x2out(i,j) = (I(i,j)-x2)*(range-y2)/(range-x2) + y2;elseout(i,j) = (I(i,j)-x1)*(y2-y1)/(x2-x1) + y1;endendend% 将输出图像的格式转化为与输入图像相同if isa(A, 'uint8') % uint8out = im2uint8(out);elseif isa(A, 'uint16')out = im2uint16(out);% 其它情况,输出双精度类型的图像end% 输出:if nargout==0 % 如果没有提供参数接受返回值imshow(out);return;end
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 nargincase 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 4A = 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);endif ~isempty(map) % 检查调色板if (size(map,2) ~= 3) || ndims(map)>2msg1 = 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);endend% 将int16类型的矩阵转换成uint16类型if isa(A,'int16')A = int16touint16(A);end
end

调用函数时,使用imgrayscaling(J, [x1, x2], [y1, y2]);

结果图

在这里插入图片描述

以上是个人理解,如有错误欢迎指出!

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...