DICOM图像中灰度理解

背景

前段时间项目组开发了一款在线影像文件质控的web工具,当时研究员提出了这样一个需求,当点击图像的某一个点时,将这个点不同时间上的(MRI扫描是持续一段时间的,扫描相同部位时,根据扫描频率就会产生多张图像)灰度值用折线图描绘出来。要想完成这个需求,首先就要弄清楚灰度值是什么。

理解含义

百度百科

从百度百科上可以看出灰度通俗的讲就是用一个数字描述的黑白程度,值越小图片越暗。这样的理解对应想知道概念的人基本足够了,但是对于咱们coding的工程师,还需要进一步了解。

先来看看常见的的一些概念

RGB:我们生活中通过三原色深浅组成不同的颜色,前端开发中常用RGB来指定色彩,R、G、B 都是 0-255, 比如 (255,255,255) 表示白色,用16进制表示255就是ff, 所以255,255,255 可以表示为 ffffff, 在css样式表中写为 #ffffff。
像素:图片我们都知道是由多个像素组成的,是图像的最小单元,如果这个单元里只有一个bit大小,也就是只有0和1两个值,由这种像素组成的图像称二值图像,显然它可以表示一个黑白图。这个单位里也可以存一个16位二进制数,24位..., 可以想象存储的越大,一个像素能表达的颜色就越丰富,整体图像呈现就越精细,当然图片占用的空间也就越大。

1位图像(即二值图像)只能表示黑白,那二位图像就可以表示4种颜色(00,01,10,11,VGA),依次类推,4位(16色,VGA),8位(256色),16位(增强色),24位和32位(真彩色)等。
色彩图像:以RGB图像为例,RGB图像每一个像素的颜色值(由RGB三原色表示)直接存放在图像矩阵中,由于每一像素的颜色需由R、G、B三个分量来表示,M、N分别表示图像的行列数,三个M x N的二维矩阵分别表示各个像素的R、G、B三个颜色分量,假设我们在绘图的时候只取第一个矩阵,那么绘制出来的就是红色分量的图片。
灰度图像:每个像素只有一个采样颜色,这类图像通常显示为从最暗黑色到最亮的白色的灰度,尽管理论上这个采样可以任何颜色的不同深浅,甚至可以是不同亮度上的不同颜色。

灰度级: 灰度级表明图像中不同灰度的最大数量。灰度级越大,图像的亮度范围越大。二值图像一个像素只能存0和1,它的灰度级就为2,8位图一个像素表示0-255共256个灰度值,所有它的灰度级为256, 那么存储一张512*512,256级灰度的图片需要的空间就为 512*512*8=2,097,152 bit ≈ 1.7 Mb

图像的灰度化:

图像的灰度化是让像素点矩阵中的每一个像素点都满足关系:R=G=B,此时的这个值叫做灰度值。如RGB(100,100,100)就代表灰度值为100,RGB(50,50,50)代表灰度值为50。

RGB彩色图像一般灰度化处理的方法:

  • 浮点算法:Gray=R*0.3+G*0.59+B*0.11
  • 整数方法:Gray=(R*30+G*59+B*11)/100
  • 移位方法:Gray =(R*28+G*151+B*77)>>8
  • 平均值法:Gray=(R+G+B)/3
  • 仅取绿色:Gray=G

DICOM中灰度

回顾背景中提到的需求,要想获取到灰度值,首先需要读取到DICOM中的像素数据,DICOM标准中定义PixelData(7FE0,0010)标签表示像素数据,以下使用dcm4che演示获取像素方法

File dcm = new File("xxx.dcm");
DicomInputStream dis = new DicomInputStream(dcm);
Attributes dataSet = dis.readDataset(-1, -1);
byte[] pixelData = dataSet.getBytes(Tag.PixelData);

获取到像素数据之后,还是无法确定某一点的灰度值,要实现这样的需要,还需要知道DICOM标准中定义的下面几个Tag

  • Photometric Interpretation 该字段常见的值有MONOCHROME1、MONOCHROME2、PALETTE COLOR、RGB
    • MONOCHROME1和MONOCHROME2 表示单通道灰度图像,只是两者对黑色和白色的映射相反而已;
    • PALETTE COLOR 就是BMP中提到的调色板图;
    • RGB是常见的R(红)、G(绿)、B(蓝)三通道彩色图像
  • Rows(0028,0010) 图像行数, 即高度
  • Columns(0028,0011) 图像列数,即宽度
  • BitsAllocated(0028,0100) 图像数据存储位数,一般是8位和16位
  • PixelRepresentation(0028,0103) 是否是带符号,0是无符号,1是有符号
System.out.println(dataSet.getString(Tag.PhotometricInterpretation));
System.out.println(dataSet.getInt(Tag.BitsAllocated, 0));
System.out.println(dataSet.getInt(Tag.PixelRepresentation, -1));
System.out.println("rows: "+dataSet.getInt(Tag.Rows, 0));
System.out.println("columns: "+dataSet.getInt(Tag.Columns, 0));
System.out.println("pixelData length: " + pixelData.length);

输出结果:

MONOCHROME2
16
0
rows: 900
columns: 900
pixelData length: 1620000

从结果可以看出本例使用的是一张16位灰度图,像素为 900*900。16位图一个像素使用两个字节(1字节为8bit),所以900*900 总字节长度 = 900*900*2 = 1620000,与上面打印的结果也是一致的。假如现在要取第10行第2列的像素值,那么数组下标计算如下:

# 第一行第二列即 row=10,column=2
index1 = ((row-1)*900 + column-1) * 2  =  16202
index2 = index1 + 1 = 16203
byte[] pixelData = dataSet.getBytes(Tag.PixelData);
# 16位像素两个字节,  (java 默认都是BigEndian,所以第二个字节是高位)
short pixel = (short) ((pixelData[36202] & 0xff) | ((pixelData[36203] & 0xff) << 8));
System.out.println(pixel); 

由于是灰度图像,取到的像素里的内容就是灰度值。至此,要实现最开始需求,只需要完成如下几步即可:

  • 获取用户的鼠标焦点
  • 通过一系列换算将焦点转为像素位置
  • 获取每个时间点图片相同位置的灰度值
  • 利用绘图软件绘出折线图

大概思路是这样的,本文主要探讨了灰度值的一种获取方式,部分内容参考了以下文章:

  1. DICOM入门(二)——图像
  2. 通过DCM4CHE获取dicom文件像素值
  3. DICOM图像像素值、灰度值与CT值
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,200评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,526评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,321评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,601评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,446评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,345评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,753评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,405评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,712评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,743评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,529评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,369评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,770评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,026评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,301评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,732评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,927评论 2 336

推荐阅读更多精彩内容