我用显微镜拍摄粒子的图像。我在一个包含信息的xml文件中获取数据(见文件的摘录),我想知道是否可以使用输入像素来获取粒子的图片。我很困惑它是否是像素数据,因为有些条目也有字母。如果有可能的话,如何才能做到呢?
<particledata FileVersion="1.0"> <data measurement="2022-09-26 13:31:34.4610 0228 Q" product="EQPT" filter="<<DIAMETER_EQPC >= 1E-5>> AND <<DIAMETER_EQPC <= 0.0002>>"/> <particle frame="181" EQPC="5.92777219475097e-05" FERET_MAX="6.16502327208423e-05" FERET_MIN="5.96099987626077e-05" FERET_MEAN="6.09342368979882e-05" SPHERICITY="0.947197455424963" ASPECT_RATIO="0.966906305650574" CONVEXITY="0.956224350205198"> <image width="30" height="30" pixel="0E0000000100090001000B00070002001000060003001200050004001400040005001600030006001800020007001A00020008001A00010009001C0001000A001C0000000B001D0000000C001D0000000D001E0000000E001E0000000F001E00000010001E00000011001E00000012001D00010013001C00010014001C00010015001C00020016001A00020017001A0003001800180004001900160005001A00140006001B00110008001C000E000A001D000900"/> </particle> <particle frame="439" EQPC="1.75112776854003e-05" FERET_MAX="2.70261182554826e-05" FERET_MIN="1.98699995875359e-05" FERET_MEAN="2.33606593187573e-05" SPHERICITY="0.539453245456778" ASPECT_RATIO="0.735214706000371" CONVEXITY="0.635416666666667"> <image width="12" height="10" pixel="0800000001000500010005000500020005000100010003000100020003000100030009000100040004000600040005000100050005000700050004000000060004000800060002000100070002000800070004000200080001000800080002000B0008000100080009000100"/> </particle>
发布于 2022-11-17 01:02:15
虽然这是一种未知的数据格式,但是看起来,16位十六进制格式中的一系列整数坐标(x,y)按顺序存储在小端字节序中。
因此,通过重复(1)获取4个十六进制数字并(2)将它们解析为一个小的endian整数(如下所示),您可能能够获得绘制一个图所需的所有绘图点。
0E 00 -> 0x000e = 14 x0
00 00 -> 0x0000 = 0 y0
01 00 -> 0x0001 = 1 x1
09 00 -> 0x0009 = 9 y1
:附录:尝试以编程方式解析它。
如果使用javascript,可以按以下方式解析pixel数据。
const canvas = document.querySelector('canvas');
const ctx = canvas.getContext('2d');
const pixelsData = document.getElementById('pixelsData');
let backup = pixelsData.value;
function parsePixels(pixels) {
let points = [];
let matches = String(pixels).matchAll(/([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})/g);
let m;
while(!(m = matches.next()).done) {
const x = parseInt(m.value[2] + m.value[1], 16);
const y = parseInt(m.value[4] + m.value[3], 16);
points.push([x, y]);
}
return points;
}
function parseIt() {
let rawCoordinates = pixelsData.value;
let points = parsePixels(rawCoordinates); // [ [x,y], ...]
if (points.length < 1) return;
backup = rawCoordinates;
pixelsData.value = points.map(xy => xy.join("\t")).join("\n");
// Plot points on the canvas
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.scale(5, 5);
points.forEach(xy => { ctx.fillRect(xy[0], xy[1], 1, 1); });
ctx.resetTransform();
}
function resetIt() {
pixelsData.value = backup;
ctx.clearRect(0, 0, canvas.width, canvas.height);
}canvas { border: solid silver 1px;}
button { margin: 8px 0px 8px 0px;}
textarea { width: 320px; height: 240px;}<canvas width="160" height="160"></canvas><br/>
<button onclick="parseIt()">Parse</button> <button onclick="resetIt()">Reset</button> <br/>
<textarea id="pixelsData" >0E0000000100090001000B00070002001000060003001200050004001400040005001600030006001800020007001A00020008001A00010009001C0001000A001C0000000B001D0000000C001D0000000D001E0000000E001E0000000F001E00000010001E00000011001E00000012001D00010013001C00010014001C00010015001C00020016001A00020017001A0003001800180004001900160005001A00140006001B00110008001C000E000A001D000900</textarea>
发布于 2022-11-22 13:05:30
充分赞扬@ardget用于搜索像素数据的格式!我想做一个Python版本,如下所示:
#!/usr/bin/env python3
import re
from PIL import Image
from struct import unpack
from binascii import unhexlify
xml = """<particledata FileVersion="1.0"> <data measurement="2022-09-26 13:31:34.4610 0228 Q" product="EQPT" filter="<<DIAMETER_EQPC >= 1E-5>> AND <<DIAMETER_EQPC <= 0.0002>>"/> <particle frame="181" EQPC="5.92777219475097e-05" FERET_MAX="6.16502327208423e-05" FERET_MIN="5.96099987626077e-05" FERET_MEAN="6.09342368979882e-05" SPHERICITY="0.947197455424963" ASPECT_RATIO="0.966906305650574" CONVEXITY="0.956224350205198"> <image width="30" height="30" pixel="0E0000000100090001000B00070002001000060003001200050004001400040005001600030006001800020007001A00020008001A00010009001C0001000A001C0000000B001D0000000C001D0000000D001E0000000E001E0000000F001E00000010001E00000011001E00000012001D00010013001C00010014001C00010015001C00020016001A00020017001A0003001800180004001900160005001A00140006001B00110008001C000E000A001D000900"/> </particle> <particle frame="439" EQPC="1.75112776854003e-05" FERET_MAX="2.70261182554826e-05" FERET_MIN="1.98699995875359e-05" FERET_MEAN="2.33606593187573e-05" SPHERICITY="0.539453245456778" ASPECT_RATIO="0.735214706000371" CONVEXITY="0.635416666666667"> <image width="12" height="10" pixel="0800000001000500010005000500020005000100010003000100020003000100030009000100040004000600040005000100050005000700050004000000060004000800060002000100070002000800070004000200080001000800080002000B0008000100080009000100"/> </particle>"""
seq = 0
# Iterate over all <image width=/height=/pixel=> occurrences in xml string
for match in re.finditer('<image width="(\d+)" height="(\d+)" pixel="([0-9A-F]+)"', xml):
# Extract width, height and pixels
width, height, pixel = match.groups()
filename = f'extracted-{seq}.png'
print(f'Image width: {width}, height: {height} -> {filename}')
# Make a new, empty, black image the correct size
im = Image.new('L', (int(width)+1,int(height)+1))
# Unpack the hideous hex into groups of 4 hexdigits, each a short
shorts = [pixel[i:i+4] for i in range(0,len(pixel), 4)]
# print('DEBUG: ', shorts)
# Convert little-endian short hex string things into integers
px = [unpack('<H', unhexlify(short))[0] for short in shorts]
# print('DEBUG: ',px)
# Put the pixels in the image with white colour - slowly but there are only a few
for i in range(0, len(px), 2):
x, y = px[i], px[i+1]
im.putpixel((x,y), 255)
# print(f'DEBUG: x={x}, y={y}')
# Save the image
im.save(filename)
seq += 1产生两个PNG,如下所示:
-rw-r--r--@ 1 mark staff 1376 22 Nov 13:01 extracted-0.png
-rw-r--r--@ 1 mark staff 861 22 Nov 13:01 extracted-1.png为增加可见度,略有扩大:


我注意到数据中有0和30的像素位置,给出了31像素的范围,但是图像大小是30。输入数据有一些不一致之处,或者至少我们对它的理解是不一致的。我做的图像比它的尺寸显示的高1像素和宽。
https://stackoverflow.com/questions/74464204
复制相似问题