一、摘要:
本实验使用了opencv Mat类,逐像素访问及修改方法,滚动条及鼠标操作,最终实现了窗宽窗位调节。
二、实验内容:
1. 设计实现一个软件,利用OpenCV一种逐像素访问方法实现图像的窗口窗位调节显示。
2. 基于highgui的鼠标事件实现医学图像的窗口窗位调节。
三、算法流程:
四、代码解析:
实验中首先需要明确何为窗宽窗位。简单的说,正常情况下8位灰度图像素取值为0~255,这也是最普遍使用的图像灰度量化范围;而医学图像灰度范围为0~几千,于是我们需要一个线性映射将一定范围内的源医学图像灰度映射到0~255中。
如下图所示,窗宽可以理解为这个范围的中心,窗宽为这个范围大小。
代码中的实现如下:
show.at(i, j) = saturate_cast(float(255)/short(width)*(frame.at(i, j)-(level-width/2)));
saturate_cast
此外,设置滚动条事件与鼠标讯息回圈函数代码如下:
void change(int,void*) {
int i = 0;
int j = 0;
for(i=0;i(i, j) = saturate_cast(float(255)/short(width)*(frame.at(i, j)-(level-width/2)));
}
}
void mouse(int event, int x, int y, int flags,void* userdata){
switch (event) {
case(2):level = 400; width = 100;;
setTrackbarPos("width", "20374230", width);
setTrackbarPos("level", "20374230", level);
change(0, 0);
break;
}
switch (flags)
{case EVENT_FLAG_LBUTTON:
level= 1500-3*(x - k); width =320-0.5*( y - l);
setTrackbarPos("width", "20374230", width);
setTrackbarPos("level", "20374230", level);
change(0,0);
break;
default:
break;
}
}
鼠标回圈函数利用了滚动条回圈函数。
五、实验过程:
六、实验结果:
实验开始时打开图像如上图显示,初始窗宽设为100,初始窗位设为400。
调节窗宽效果如图显示。
调节窗位效果如图显示。
七、结果分析与实验结论:
本次实验实现了从short型到float型的像素值映射并逐像素访问修改,实现了鼠标事件以及滚动条事件的窗宽窗位调整。实验效果较好。
源码如下:
#include
#include
using namespace cv;
using namespace std;
Mat k2;
Mat k1;
int level=400;
int width=100;
Mat frame;
Mat show;
int k;
int l;
void change(int,void*) {
int i = 0;
int j = 0;
for(i=0;i(i, j) = saturate_cast(float(255)/short(width)*(frame.at(i, j)-(level-width/2)));
}
}
void mouse(int event, int x, int y, int flags,void* userdata){
switch (event) {
case(2):level = 400; width = 100;;
setTrackbarPos("width", "20374230", width);
setTrackbarPos("level", "20374230", level);
change(0, 0);
break;
}
switch (flags)
{case EVENT_FLAG_LBUTTON:
level= 1500-3*(x - k); width =320-0.5*( y - l);
setTrackbarPos("width", "20374230", width);
setTrackbarPos("level", "20374230", level);
change(0,0);
break;
default:
break;
}
}
int main()
{
double n[] = { 1,2,3,4,1,3,4,5,1 };
k1=Mat(3, 3, CV_64FC1, n);
k2 = Mat(3, 3, CV_64FC1,n);
cout << k1 <
实验用图在此,上传网页后可能格式发生更改了,从而其内部像素值全变成了255。