function ScaleBW=getscale(zeroRGB)
%获得刻度二值图函数,输入指零24位bmp图像,输出刻度二值图
ScaleGray = rgb2gray(zeroRGB);
%ScaleGray=medfilt2(ScaleGray);中值滤波会对刻度有损害
[m,n]=size(ScaleGray);
%剪切刻度附近区域来求二值化阈值
for i=1:0.4*m
for j=1:0.7*n
tempGray(i,j)=ScaleGray(0.15*m+i,0.15*n+j);
end
end
level = graythresh(tempGray);
ScaleBW = im2bw(ScaleGray,level*0.96);
%figure,imshow(ScaleBW),title('二值化结果');
%使指针脱离开来
for j=70:250
ScaleBW(140,j)=1;
end
%figure,imshow(ScaleBW); %二值化结果
ScaleBW=~ScaleBW;
MaxBW=max_label(ScaleBW);
TempBW=MaxBW;
ScaleBW=xor(ScaleBW,TempBW);
ScaleBW=filter_label(ScaleBW);
%figure,imshow(ScaleBW); %二值化结果
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%搜索最长的连通域,作为指针
[ScaleBW_Label,Num]=bwlabel(ScaleBW);
for k=1:Num
flag=0;
for i=1:m
for j=1:n
if ScaleBW_Label(i,j)==k && flag==0
high_point(k,1)=i;
high_point(k,2)=j;
flag=1;
end
if ScaleBW_Label(i,j)==k && flag~=0
low_point(k,1)=i;
low_point(k,2)=j;
end
end
end
end
for k=1:Num
length(k,1)=(high_point(k,1)-low_point(k,1))^2+(high_point(k,2)-low_point(k,2))^2;
end
[a,I]=max(length);
PBW=zeros(m,n);
for i=1:m
for j=1:n
if ScaleBW_Label(i,j)==I
PBW(i,j)=1;
ScaleBW(i,j)=0;
end
end
end
%figure,imshow(ScaleBW),title('提取指针之后');
%滤除平均宽度较大的连通域
[ScaleBW_Label,Num]=bwlabel(ScaleBW);
for k=1:Num
count_i=0;
count_j=0;
sum_j=0;
for i=1:m
for j=1:n
if ScaleBW_Label(i,j)==k
if count_j==0
count_i=count_i+1;
zuobiao(count_i,1)=i;
end
sum_j=sum_j+j;
count_j=count_j+1;
end
if j==1 && count_j~=0
zuobiao(count_i,2)=sum_j/count_j;
count_j=0;
sum_j=0;
end
end
end
sum_distance=0;
count_points=0;
for i=zuobiao(1,1):zuobiao(count_i,1);%zuobiao(:,1)
for j=1:n
if ScaleBW_Label(i,j)==k
sum_distance=sum_distance+abs(j-zuobiao(i-zuobiao(1,1)+1,2));
count_points=count_points+1;
end
end
end
average_distance(k)=sum_distance/count_points;
end
for k=1:Num
if average_distance(k)>0.8
for i=1:m
for j=1:n
if ScaleBW_Label(i,j)==k
ScaleBW(i,j)=0;
end
end
end
end
end
%figure,imshow(ScaleBW),title('去除平均宽度较大的标签后');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%去除最上、左、右边阴影
for i=1:20
for j=1:n
ScaleBW(i,j)=0;
end
end
for i=1:m
for j=1:25
ScaleBW(i,j)=0;
end
end
for i=1:m
for j=285:n
ScaleBW(i,j)=0;
end
end
%去除最下边阴影
for i=120:m
for j=1:n
ScaleBW(i,j)=0;
end
end
%figure,imshow(ScaleBW);
%%*******************************************************
%滤除数字
%[ScaleBW_Label,Num]=bwlabel(ScaleBW);
%low_point_i=zeros(Num,1);
%low_point_j=zeros(Num,1);
%for i=1:m
% for j=1:n
% if ScaleBW(i,j)~=0
% low_point_i(ScaleBW_Label(i,j),1)=i;
% low_point_j(ScaleBW_Label(i,j),1)=j;
% end
% end
%end
%average_difference=0; %平均落差
%for t=2:Num
% average_difference=average_difference+abs(low_point_i(t)-low_point_i(t-1));
%end
%average_difference=average_difference/(Num-1);
%current_p=1;
%count_scale=1;
%scale_p(count_scale,1)=current_p;
%for t=2:Num-1
% if abs(low_point_i(t,1)-low_point_i(current_p,1))<average_difference*0.7 %&& low_point_j(t,1)-low_point_j(current_p,1)<15
% current_p=t;
% count_scale=count_scale+1;
% scale_p(count_scale,1)=current_p;
% end
%end
%for i=1:m
% for j=1:n
% if ScaleBW_Label(i,j)~=0
% for t=1:count_scale
% if ScaleBW_Label(i,j)==scale_p(t,1)
% ScaleBW_Label(i,j)=200;
% end
% end
% end
% end
%end
%for i=1:m
% for j=1:n
% if ScaleBW_Label(i,j)==200
% ScaleBW_Label(i,j)=1;
% else
% ScaleBW_Label(i,j)=0;
% end
% end
%end
%ScaleBW=ScaleBW_Label;
%***********************************************************
min_i=0;
for i=1:m
for j=1:n
if PBW(i,j)~=0
min_i=i;
break
end
end
if min_i~=0
break
end
end
for i=min_i+14:m
for j=1:n
PBW(i,j)=0; %零刻度
end
end
%figure,imshow(PBW),title('ddd');
ScaleBW=or(PBW,ScaleBW);
%figure,imshow(ScaleBW);
[ScaleBW_Label,Num]=bwlabel(ScaleBW);
low_point_i=zeros(Num,1);
low_point_j=zeros(Num,1);
for i=1:m
for j=1:n
if ScaleBW(i,j)~=0
low_point_i(ScaleBW_Label(i,j),1)=i;
low_point_j(ScaleBW_Label(i,j),1)=j;
end
end
end
for k=1:Num
for i=low_point_i(k,1)-35:low_point_i(k,1)-22
for j=low_point_j(k,1)-15:low_point_j(k,1)+15
if i>0 && j>0
ScaleBW(i,j)=0;
end
end
end
end
for i=1:m
for j=160:n
if ScaleBW(i,j)~=0
lowest_i=i;
lowest_j=j;
end
end
end
for i=lowest_i-35:lowest_i-20
for j=lowest_j:lowest_j+25
ScaleBW(i,j)=0;
end
end
ScaleBW=filter_label(ScaleBW);
MATLAB识别指针式仪表的示数
1星 需积分: 48 73 浏览量
2018-09-05
21:28:34
上传
评论 20
收藏 1013KB ZIP 举报
我想长大
- 粉丝: 2
- 资源: 2
最新资源
- mosquitto-2.018-install-windows-x64
- FTPServer FTP 服务器,绿色免安装,单文件
- 梦畅语音点名软件,上课点名
- 利用ADNI数据集和标签,在tensorflow框架上使用tensorlayer接口,通过架构u-net实现海马体的分割
- Kutools for Word v9.0 office word 插件
- 修复Windows 10 LTSC 2021资源占用率高
- Hash工具,小巧绿色hash校验工具,免费hash工具
- 重启进行BIOS快捷方式,不需要开机按BIOS键
- 鸭子开车记(儿童绘本)
- 威纶通触摸屏编程软件Easy builder pro V6.09.01.556安装包(2024.04).txt
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈