提取图片颜色信息转数据信息

提取图片颜色信息转数据信息

背景:给定原始图片如下,数据范围为0~2 π \pi π,如何通过给定图片,提取出来对应的数据信息。

提取图片颜色信息转数据信息_第1张图片

目录

    • 提取图片颜色信息转数据信息
  • 分析
  • 颜色模型
  • 图像预处理
    • 图像修复
    • 图片重建和裁剪
    • 提取数据

分析

原始图片存在两个数据图Transmitted wave 和 Reflected wave,接下来将其简称为c图和d图。两数据图的颜色范围和数据范围均一致,之后以c图进行分析:

项目 Value
l l l 2.25 μ m \mu m μm
d d d 0.5 μ m \mu m μm
数据范围 0~2 π \pi π
颜色范围 赤、橙、黄、绿、青、蓝、紫
图片像素 W × \times × L

具体思路

  1. 图片预处理:
    • 图片裁切,将数据图所在区域裁剪提取出来;
    • 去除左上角黑色字符 φ \mathit{\varphi} φ Ψ \mathit{\Psi} Ψ
  2. 逐个元素进行颜色信息提取,储存到W × \times × L颜色矩阵中;
  3. 建立颜色与数据的对照函数(转换函数);
  4. 将像素点的颜色信息转化为数据,并储存W × \times × L数据矩阵中;
  5. 建立plot函数,将数据矩阵信息输出为类似原始图片的图片形式,已检测数据提取的正确性;
  6. 将W × \times × L数据矩阵进行平滑插值处理,以增加分辨率;

颜色模型

在这个问题实现过程中,接触到了不同颜色划分的方式,记录一下具体见另一篇文章 颜色模型介绍

本次主要使用HSV和RGB两种颜色模型

图像预处理

图像修复

% main
clc,clear, close all;
imageData = imread('data_fig.jpg');

imageData = fig_repair(imageData);
imageData = fig_repair(imageData);
function reconstructedImage = fig_repair(data_fig)
	% fig_repair 图片修复 
	% 首先显示原始图片,而后使用鼠标选取需要修复的部分(图片中$\Phi$ $\Psi$)
	% 而后使用inpaintExemplar函数修复图像
	
	% 显示图像
	figure;
	imshow(data_fig);
	title('原始图像');

	% 定义遮挡区域的矩形框位置
	% symbolRegion = [x, y, width, height]; % 替换成符号的矩形框位置信息
	% [147,38,19,22] [460,38,22,23]
	h = imrect;
	wait(h);
	symbolRegion = round(getPosition(h));
	
	% 提取遮挡区域
	mask = false(size(data_fig, 1), size(data_fig, 2));
	% mask(y:y+height, x:x+width) = true;
	mask(symbolRegion(2):symbolRegion(2)+symbolRegion(4), symbolRegion(1):symbolRegion(1)+symbolRegion(3)) = true;
	
	% 使用inpaintExemplar函数修复图像
	reconstructedImage = inpaintExemplar(data_fig, mask);
	
	% 显示修复后的图像
	figure;
	imshow(reconstructedImage);
	title('修复后的图像');
end

注:运行过程中,需要手动选取需要修复的部分,以“方块”选框,选择完毕后双击该选框。

结果如下:
提取图片颜色信息转数据信息_第2张图片

图片重建和裁剪

% main
clearedImage = fig_clear(imageData);  % 图片重建,增加分辨率
croppedImages = fig_cut_num(clearedImage,2); % 图片裁剪
for i = 1:numel(croppedImages)
    image_temp = cutoffWhite(croppedImages{1,i}); % 去除白边
    croppedImages{1,i} = cutoffBlack(image_temp); % 去除黑边
end

提取数据

这是一年前写的,很简陋。
原理是:

  1. 裁剪图片上的colorbar部分,并将重建clearedImage ,增加清晰度分辨率;
  2. 提取clearedImage中rgb信息,因为图片有一定的宽度,所以采取中间线提取rgb信息;
  3. 设置数据范围0~2 π \pi π;
  4. 通过get_colorbar函数获取data_colorbar,valueRange数据,该数据中data_colorbar是10003的rgb信息,valueRange是10001的0~2 π \pi π的数据点;
  5. 通过判断最邻近法判断clearedImage中rgb信息与data_colorbar中哪一个最邻近,则设置该像素点的数据为valueRange中对应数据;

现在需要对其进行更改:

  1. 设置数据范围0~2 π \pi π;
  2. 使用matlab自带的rgb2hsv函数进行变换,处理croppedImages;
  3. croppedImages{1,1}的HSV信息中H直接乘以2 π \pi π,即可获取对应的数据;(该方法使用rgb2hsv,正确性相比之前更高,并且更易理解)

注:该方法需要图片的colorbar时hsv形式,如下图
提取图片颜色信息转数据信息_第3张图片
旧的代码:

% main
%% colorbar 处理colorbar
image_colorbar = imread('colorbar_fig.jpg');
clearedImage = fig_clear(image_colorbar);
[data_colorbar,valueRange] = get_colorbar(clearedImage);
check_colorbar(clearedImage,data_colorbar);

scales = [0,2*pi];
resolution = 1000;% 分辨率
[data_colorbar,valueRange] = get_colorbar_hsv(scales,resolution);
%% 提取数据
tic
dataMatrixs = {};
error = {};
for i = 1:numel(croppedImages)
    dataMatrix = fig_toData(croppedImages{1,i},data_colorbar,valueRange);
    dataMatrixs{1,i} = dataMatrix;
    error{1,i} = check_data(croppedImages{1,i},dataMatrixs{1,i});
end
toc

新的代码部分

% main
scales = [0,2*pi];
%% 提取数据
tic
dataMatrixs = {};
for i = 1:numel(croppedImages)
	hsvImage = rgb2hsv(croppedImages{1,i});
    dataMatrixs{1,i} = hsvImage(:,:,1) * (scales(2)-scales(1)) + scales(1);
end
toc

其中一部分函数没有放上来,之后会上传附件

你可能感兴趣的:(图像处理,matlab)