赞
踩
这个小工具可以提取多条曲线,由之前在CSDN文章中看到的代码改进而来,简单实用,丑点无所谓,你可以自己修改,我主要是假期碰到大量曲线提取的任务所以弄来提高生产力的。
直接上看效果:
解释一下,运行程序之后会提示你选中曲线图,然后会将图片显示出来,再单击需要提取的那条曲线,接着再右键,会对图片进行处理,去除多余的曲线。接下来再双击图片,会有十字出现用于选中坐标轴范围,先点左上角再点右下角就会出现提取到的曲线了,曲线的数据存储在代码中的变量里,可以自行处理,需要注意的是坐标轴的最大值和最小值需要自行在代码里面更改,因为我需要批量处理图片,所以都选取的固定值。
关于曲线提取的部分我稍微看了一下,效果还不错,代码也不难,思路建议去看原博主的,我这里主要提供这样一个工具方便批量处理图片曲线,并且支持多曲线提取。
代码如下:
import java.awt.Robot; global robot robot = java.awt.Robot; close all [ file path] = uigetfile('*.jpg','MultiSelect','off') a = imread(fullfile(path,file )); fh = figure('menubar','none','NumberTitle','off','toolbar','none',... 'color','w','position',[400 50 1400 800],'WindowButtonUpFcn',@getRGB,... 'Tag','fh'); Axes = axes('parent',fh,'units','normalized','position',[0.05 0.05 0.4 0.8],... 'visible','on') Axes2 = axes('parent',fh,'units','normalized','position',[0.5 0.05 0.4 0.8],... 'visible','on') axes(Axes); imshow(a); setappdata(fh,'im',a); setappdata(fh,'Axes2',Axes2); setappdata(fh,'Axes',Axes); ddddd = uicontrol('parent',fh,'style','pushbutton','units','normalized','position',... [0 0 0.1 0.1],'callback',@jjj); ddddd2 = uicontrol('parent',fh,'style','pushbutton','units','normalized','position',... [0.8 0 0.1 0.1],'callback',@jjj2); function getRGB(~,~) fh = findobj('Tag','fh'); switch get(fh,'SelectionType') case 'normal' global robot xy = get(0,'ScreenSize'); xy(1:2) = []; x = get(0,'PointerLocation'); robot.mouseMove(x(1),xy(2)-x(2)) a = robot.getPixelColor(x(1),xy(2)-x(2)) red = a.getRed(); green = a.getGreen(); blue = a.getBlue(); setappdata(fh,'RGB',[red green blue]); case 'alt' a = getappdata(fh,'im'); rgb = getappdata(fh,'RGB'); a1 = a(:,:,1); a2 = a(:,:,2); a3 = a(:,:,3); d = find(abs(a1-rgb(1)>20)|abs(a2-rgb(2)>20)|abs(a3-rgb(3)>20)); a1(d) = 255; a2(d) = 255; a3(d) = 255; a(:,:,1) = a1; a(:,:,2) = a2; a(:,:,3) = a3; imshow(a) setappdata(fh,'im2',a); case 'open' im = getappdata(fh,'im2'); im=rgb2gray(im);%灰度变化 thresh = graythresh(im);%二值化阈值 im=im2bw(im,thresh);%二值化 set(0,'defaultfigurecolor','w') imshow(im)%显示图片 [y,x]=find(im==0);%找出图形中的“黑点”的坐标。该坐标是一维数据。 y=max(y)-y;%将屏幕坐标转换为右手系笛卡尔坐标 y=fliplr(y);%fliplr()——左右翻转数组 plot(x,y,'k.','Markersize', 2); [Xx,Yy]=ginput(2);%Xx,Yy——指实际坐标框的两个顶点 min_x=0; max_x=20; min_y=0; max_y=140; x=(x-Xx(1))*(max_x-min_x)/(Xx(2)-Xx(1))+min_x; y=(y-Yy(1))*(min_y-max_y)/(Yy(2)-Yy(1))+max_y; plot(x,y,'k.','Markersize', 2); axis([min_x,max_x,min_y,max_y])%根据输入设置坐标范围 rate_x=0.008;%曲线的最前端和最后段删除比例 rate_y=0.008;%曲线的最顶端和最底段删除比例 [x_uni,index_x_uni]=unique(x);%找出有多少个不同的x坐标 x_uni(1:floor(length(x_uni)*rate_x))=[];%除去前rate_x(如5%)的x坐标 x_uni(floor(length(x_uni)*(1-rate_x)):end)=[];%除去后rate_x的x坐标 index_x_uni(1:floor(length(index_x_uni)*rate_x))=[];%除去前rate_x的x坐标 index_x_uni(floor(length(index_x_uni)*(1-rate_x)):end)=[];%除去后rate_x的x坐标 [mxu,~]=size(x_uni); [mx,~]=size(x); for ii=1:mxu if ii==mxu ytemp=y(index_x_uni(ii):mx); else ytemp=y(index_x_uni(ii):index_x_uni(ii+1)); end threshold1=mean(ytemp)-std(ytemp); threshold2=mean(ytemp)+std(ytemp); ytemp(find(ytemp<threshold1))=[]; ytemp(find(ytemp>threshold2))=[]; thresholdy=(max_y-min_y)*rate_y; ytemp(find(ytemp>max_y-thresholdy))=[]; ytemp(find(ytemp<min_y+thresholdy))=[]; y_uni(ii)=mean(ytemp); end x_uni(find(isnan(y_uni)))=[]; y_uni(find(isnan(y_uni)))=[]; size(x_uni) size(y_uni) hh = find(x_uni<min_x); x_uni(hh) = []; y_uni(hh)= []; Axes2 = getappdata(fh,'Axes2') axes(Axes2) plot(x_uni,y_uni) title('提取曲线') axis([min_x,max_x,min_y,max_y])%根据输入设置坐标范围 Axes = getappdata(fh,'Axes') axes(Axes) end end function jjj(~,~) fh = findobj('Tag','fh'); a = getappdata(fh,'im'); imshow(a) end function jjj2(~,~) [ file path] = uigetfile('*.jpg','MultiSelect','off') a = imread(fullfile(path,file )); fh = findobj('Tag','fh'); figure(fh) imshow(a) end
下面是相关的文章,有兴趣可以看看,有关MATLAB调用有关API的使用
链接: 百度云人脸识别.
链接: 百度云文字识别
链接: 有道翻译
链接: 百度地图经纬度.
链接: 百度云语音识别
链接: MATLAB 发送邮件 sendmail的使用.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。