我在uint16的Matlab中有一个3D数组(基本上它只是一个图像1080x1920x3)。我想将它存储在mysql中。这就是我正在做的事情:
MySQL的:
create table imgtest(img longblob);
Matlab的:
% image_data - is my image as described before
raw_im = reshape(image_data,1,[]);
conn = database('test','root','root','Vendor','MySQL','Server','localhost')
x = conn.Handle;
insertcommand = ['INSERT INTO imtest (img) values (?)'];
StatementObject = x.prepareStatement(insertcommand);
StatementObject.setObject(1,raw_im)
StatementObject.execute
问题是我在这个blob字段中写了大约600k uint16值。但是当我从数据库中取出这个字段时,我总是得到大约120万个uint8元素(恰好是两倍)。
那么,有没有办法将这个字节字段作为一组uint16读取,而不是uint8?
谢谢。
答案 0 :(得分:2)
我为我的一个项目做了类似的事情
基本上有一个区别,但也许它会向你澄清一些东西 我使用命令
将图像直接从文件加载到DBINSERT INTO BaseImage(Image)
SELECT * FROM OPENROWSET(BULK N'C:\co.jpg', SINGLE_BLOB) as image
并将其恢复到Matlab需要进行类型转换(就像@sebastian提到的那样)
SQL_query = 'select TOP 1 pk_BaseImage,Image from BaseImage order by pk_BaseImage desc';
[data] = SQL_query_exec(SQL_query);
pk_BaseImage = data.Data.pk_BaseImage;
out = typecast(data.Data.Image{1,1},'uint8');
,但.. 这还不够,我不得不做一些使用'out'作为图像的技巧 我被迫将它写入临时文件并再次将其读取到Matlab(我知道它很奇怪,但它工作得非常好,我可以例如计算DWT,DFT等)
image_matrix = get_image_matrix( out );
get_image_matrix函数如下所示:
function [ out ] = get_image_matrix( input )
targetfilename = 'temp.jpg';
%wynik
fid = fopen(targetfilename,'w');
if fid
fwrite(fid,input,'uint8');
end
fclose(fid);
out = imread(targetfilename);
delete(targetfilename);
end
我希望它能帮到你:) 一个重要的通知 - 我使用灰度图像(uint8型)
答案 1 :(得分:1)
您最有可能将uint8转换为uint16,以恢复原始图像数据:
uint16_result = typecast(uint8_result, 'uint16');
我不熟悉数据库工具箱 - 所以很可能有办法告诉Matlab自己做这件事。
答案 2 :(得分:0)
好的,谢谢你们俩。我总结了你的答案,这就是我所得到的:
由于blob字段只不过是字节数组,因此我们应该先将数据转换为matlab,然后再将其写入数据库。从DB中读取后,我们应该把它们丢回来。
最低工作示例是: MySQL的
create table imgtest(img longblob);
Matlab的
% image_data - is my image as described before
raw_im = typecast(reshape(image_data,1,[]),'uint8'); %! the main string
conn = database('test','root','root','Vendor','MySQL','Server','localhost')
x = conn.Handle;
insertcommand = ['INSERT INTO imtest (img) values (?)'];
StatementObject = x.prepareStatement(insertcommand);
StatementObject.setObject(1,raw_im)
StatementObject.execute
我们可以读回来之后:
res = exec(conn,'Select * from imtest')
array_uint8 = fetch(res);
array_uint8 = array_uint8{1};
array_uint16 = typecast(array_uint8,'uint16').
希望这会对某人有所帮助。