Determine the axis range of the graph image

1 次查看(过去 30 天)
I'm working on a small project on digitizing an image of a graph. I have a graph image as input and output as coordinate value (x,y) pairs of the graph in that image. Now I'm having a hard time determining the range of values of the axes. I want to use OCR to recognize the labels along the axes. But I don't know how to implement it. Can someone help me?? Here is an example of a graph image. I want to determine the min and max values of the x-axis (-20 and 20) and the y-axis (-1 and 6)

采纳的回答

yanqi liu
yanqi liu 2021-10-26
sir,please check the follow code to get some information
clc; clear all; close all;
im = imread('https://www.mathworks.com/matlabcentral/answers/uploaded_files/777828/image.jpeg');
bw = im2bw(im);
bw = ~bw;
bw2 = bwareaopen(bw, 1200);
bw(bw2) = 0;
bw = logical(bw);
bw3 = imclose(bw, strel('line', round(0.05*size(bw,1)), 90));
bw3 = imclose(bw3, strel('line', round(0.05*size(bw,2)), 0));
rs = sum(bw3, 2); cs = sum(bw3,1);
[~,ind1] = max(rs); [~,ind2] = max(cs);
y = 1:size(bw,1); x = 1:size(bw,2);
pt1 = [x(:) repmat(ind1,length(x), 1)];
pt2 = [repmat(ind2,length(y),1) y(:)];
bw3 = bwselect(bw3, [pt1(:,1); pt2(:,1)], [pt1(:,2); pt2(:,2)]);
bw(~bw3) = 0;
bw4 = imclose(bw, strel('line', round(0.05*size(bw,2)), 0));
bw41 = bwselect(bw4, [pt1(:,1)], [pt1(:,2)]);
bw42 = bwselect(bw4, [pt2(:,1)], [pt2(:,2)]);
bw42(bw41) = 0;
bw41 = logical(bw41); bw42 = logical(bw42);
[r1,c1] = find(bw41); [r2,c2] = find(bw42);
[~,ind1] = min(c1); [~,ind2] = max(c1);
[~,ind3] = min(r2); [~,ind4] = max(r2);
bw5 = bwselect(bw4, [c1(ind1) c1(ind2) c2(ind3) c2(ind4)], [r1(ind1) r1(ind2) r2(ind3) r2(ind4)]);
[L,num] = bwlabel(bw5);
stats = regionprops(L);
wh = 5;
bws = [];
figure; imshow(im);
for i = 1 : num
bwi = bw;
bwi(L~=i) = 0;
recti = stats(i).BoundingBox;
hold on; rectangle('Position', recti, 'EdgeColor', 'r', 'LineWidth', 2, 'LineStyle', '-');
recti = [recti(1:2)-wh recti(3:4)+2*wh];
bws{end+1} = imcrop(bwi, round(recti));
% use ocr or cnn
end
figure;
montage(bws, 'Size', [2 2], 'BackgroundColor', 'w', 'BorderSize', [3 3])
  2 个评论
Trong Link
Trong Link 2021-12-5
Thank you very much! Your code is very helpful to me but if the labels of the axes are small size (as shown below) it is not possible to get the correct position of them. Is there any way I can improve this. And if the axes are logarithmic, how can the ocr() function recognize it as a logarithmic value?
The x-axis is a logarithmic scale:
The y-axis is a logarithmic scale:
yanqi liu
yanqi liu 2021-12-5
yes,sir,if we can get the figure,may be use the handle to get data
of course,if just use image,the image may be use imresize to make it bigger,and use some interactive to get the effect value

请先登录,再进行评论。

更多回答(0 个)

类别

Help CenterFile Exchange 中查找有关 Convert Image Type 的更多信息

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by