精华内容
下载资源
问答
  • 红绿立体显示

    2012-06-15 17:00:46
    基于mfc的红绿立体显示,可以实现像对立体显示,并调整大小和相对位置关系,带实验数据
  • 针对前方交会需要选择同名点,对图像进行选点的需求,编写本程序实现对图像进行选点操作。...显示两张立体像对,利用鼠标左键选择同名点,右键对选错的点进行删除(鼠标要放到被删除点的附近) Autho...

    针对前方交会需要选择同名点,对图像进行选点的需求,编写本程序实现对图像进行选点操作。

    利用OpenCV函数读取显示图像,利用鼠标操作函数进行选点删除功能。本代码仅供参考。

    // ForwardIntersection.cpp : 定义控制台应用程序的入口点。
    //
    /*控制台实现选同名点
    显示两张立体像对,利用鼠标左键选择同名点,右键对选错的点进行删除(鼠标要放到被删除点的附近)
    Author:dyl  Date: 2018/12/07
    */
    
    #include "stdafx.h"
    #include<iostream>
    #include<opencv2\core\core.hpp>
    #include<opencv2\highgui\highgui.hpp>
    #include"opencv2/imgproc/imgproc.hpp"//putText和circle函数用到
    #include"io.h"
    
    using namespace std;
    using namespace cv;
    
    vector<Point> pointLeft,pointRight;
    
    void getFiles(std::string path, std::vector<std::string>&files)
    {
    	/*****获取路径下的所有文件*****/
    	//文件句柄
    	long hFile = 0;
    	struct _finddata_t fileinfo;
    	std::string p;
    	if ((hFile = _findfirst(p.assign(path).append("\\*").c_str(), &fileinfo)) != -1)
    	{
    		do
    		{
    			//如果是目录,迭代
    			//如果不是,加入列表
    			if (fileinfo.attrib&_A_SUBDIR)//如果是文件夹
    			{
    				if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0)
    				{
    					getFiles(p.assign(path).append("\\").append(fileinfo.name), files);
    				}
    			}
    			else
    			{
    				files.push_back(p.assign(path).append("\\").append(fileinfo.name));
    			}
    		} while (_findnext(hFile, &fileinfo) == 0);
    		_findclose(hFile);
    	}
    }
    
    void on_mouse1(int event, int x, int y, int flags, void *ustc)//event鼠标事件代号,x,y鼠标坐标,flags拖拽和键盘操作的代号  
    {
    	cv::Mat& LeftImg = *(cv::Mat*) ustc;
    	char temp[16];
    	Point pre_pt;
    	if (event == CV_EVENT_LBUTTONDOWN)//左键按下,读取初始坐标,并在图像上该点处划圆  
    	{
    		
    		Mat tempLeftImg;
    		LeftImg.copyTo(tempLeftImg);
    		pre_pt = Point(x, y);
    		pointLeft.push_back(pre_pt);
    		for (int i = 0; i < pointLeft.size(); i++)
    		{
    			sprintf(temp, "(%d,%d)", pointLeft[i].x, pointLeft[i].y);
    			putText(tempLeftImg, temp, pointLeft[i],FONT_HERSHEY_SIMPLEX, 2, Scalar(0, 0,255, 255), 2, 8);//在窗口上显示坐标  
    			circle(tempLeftImg, pointLeft[i], 2, Scalar(255, 0, 0, 0), CV_FILLED, CV_AA, 0);//划圆  
    
    		}
    		imshow("left", tempLeftImg);
    	}
    	else if (event == CV_EVENT_RBUTTONDOWN)
    	{
    		if (pointLeft.size() == 0)
    		{
    			cout<<"左图像目前没有点,不必删除,请左键选点"<<endl;
    		}
    		else
    		{
    			int Index;//记录最临近点的索引
    			double minDistance=10000000;
    			double tempDistance;
    			for (int i = 0; i < pointLeft.size(); i++)
    			{
    				tempDistance = sqrt(pow(x - pointLeft[i].x, 2) + pow(y - pointLeft[i].y, 2));
    				if (minDistance > tempDistance)
    				{
    					minDistance = tempDistance;
    					Index = i;
    				}
    			}
    			pointLeft.erase(pointLeft.begin()+Index);
    
    			Mat tempLeftImg2;
    			LeftImg.copyTo(tempLeftImg2);
    			for (int i = 0; i < pointLeft.size(); i++)
    			{
    				sprintf(temp, "(%d,%d)", pointLeft[i].x, pointLeft[i].y);
    				putText(tempLeftImg2, temp, pointLeft[i], FONT_HERSHEY_SIMPLEX, 2, Scalar(0, 0, 255, 255), 2, 8);//在窗口上显示坐标  
    				circle(tempLeftImg2, pointLeft[i], 2, Scalar(255, 0, 0, 0), CV_FILLED, CV_AA, 0);//划圆  
    			}
    			imshow("left", tempLeftImg2);
    		}
    	}
    	
    	else if (event == CV_EVENT_MOUSEMOVE)
    	{
    		Mat tempLeftImg;
    		LeftImg.copyTo(tempLeftImg);
    	
    		for (int i = 0; i < pointLeft.size(); i++)
    		{
    			sprintf(temp, "(%d,%d)", pointLeft[i].x, pointLeft[i].y);
    			putText(tempLeftImg, temp, pointLeft[i], FONT_HERSHEY_SIMPLEX, 2, Scalar(0, 0, 255, 255), 2, 8);//在窗口上显示坐标  
    			circle(tempLeftImg, pointLeft[i], 2, Scalar(255, 0, 0, 0), CV_FILLED, CV_AA, 0);//划圆  
    		}
    		pre_pt = Point(x, y);
    		sprintf(temp, "(%d,%d)",x, y);
    		putText(tempLeftImg, temp, pre_pt, FONT_HERSHEY_SIMPLEX, 2, Scalar(0, 0, 255, 255), 2, 8);//在窗口上显示坐标  
    		imshow("left", tempLeftImg);
    	}
    }
    
    void on_mouse2(int event, int x, int y, int flags, void *ustc)//event鼠标事件代号,x,y鼠标坐标,flags拖拽和键盘操作的代号  
    {
    	cv::Mat& RightImg = *(cv::Mat*) ustc;
    	char temp[16];
    	Point pre_pt;
    	 if (event == CV_EVENT_LBUTTONDOWN)//右键按下,读取初始坐标,并在图像上该点处划圆  
    	{
    		Mat tempRightImg;
    		RightImg.copyTo(tempRightImg);
    		pre_pt = Point(x, y);
    		pointRight.push_back(pre_pt);
    		for (int i = 0; i < pointRight.size(); i++)
    		{
    			sprintf(temp, "(%d,%d)", pointRight[i].x, pointRight[i].y);
    			putText(tempRightImg, temp, pointRight[i], FONT_HERSHEY_SIMPLEX, 2, Scalar(255, 0, 0, 255), 2, 8);//在窗口上显示坐标  
    			circle(tempRightImg, pointRight[i], 2, Scalar(255, 0, 0, 0), CV_FILLED, CV_AA, 0);//划圆  
    
    		}
    		imshow("right", tempRightImg);
    	}
    	else if (event == CV_EVENT_RBUTTONDOWN )//鼠标移动的处理函数  
    	{
    		if (pointRight.size() == 0)
    		{
    			cout << "右图像当前没有点,不必删除,请左键选点" << endl;
    		}
    		else
    		{
    			int Index=0;
    			double minDistance = 10000000;
    			double tempDistance;
    			for (int i = 0; i < pointRight.size(); i++)
    			{
    				tempDistance = sqrt(pow(x - pointRight[i].x, 2) + pow(y - pointRight[i].y, 2));
    				if (minDistance > tempDistance)
    				{
    					minDistance = tempDistance;
    					Index = i;
    				}
    			}
    			pointRight.erase(pointRight.begin() + Index);
    
    			Mat tempRightImg2;
    			RightImg.copyTo(tempRightImg2);
    			for (int i = 0; i < pointRight.size(); i++)
    			{
    				sprintf(temp, "(%d,%d)", pointRight[i].x, pointRight[i].y);
    				putText(tempRightImg2, temp, pointRight[i], FONT_HERSHEY_SIMPLEX, 2, Scalar(255, 0, 0, 255), 2, 8);//只是实时显示鼠标移动的坐标  
    				circle(tempRightImg2, pointRight[i], 2, Scalar(255, 0, 0, 0), CV_FILLED, CV_AA, 0);//划圆  
    			}
    			imshow("right", tempRightImg2);
    		}
    	}	
    	else if (event == CV_EVENT_MOUSEMOVE)
    	{
    		Mat tempRightImg;
    		RightImg.copyTo(tempRightImg);
    		for (int i = 0; i < pointRight.size(); i++)
    		{
    			sprintf(temp, "(%d,%d)", pointRight[i].x, pointRight[i].y);
    			putText(tempRightImg, temp, pointRight[i], FONT_HERSHEY_SIMPLEX, 2, Scalar(255, 0, 0, 255), 2, 8);//在窗口上显示坐标  
    			circle(tempRightImg, pointRight[i], 2, Scalar(255, 0, 0, 0), CV_FILLED, CV_AA, 0);//划圆  
    		}
    		pre_pt = Point(x, y);
    		sprintf(temp, "(%d,%d)", x, y);
    		putText(tempRightImg, temp, pre_pt, FONT_HERSHEY_SIMPLEX, 2, Scalar(255, 0, 0, 255), 2, 8);//在窗口上显示坐标  
    		imshow("right", tempRightImg);
    	}
    }
    
    int main()
    {
    	const char* filePath = "测试数据";
    	vector<string>files;
    	getFiles(filePath, files);//获取该路径下所有文件
    	if (files.size() == 0)
    	{
    		cout << "NO Find Files!" << endl;
    		return EXIT_FAILURE;
    	}
    	cout << "左键选点,右键删除" << endl;
    	Mat LeftImg, RightImg;
    	string left, right;
    	for (int i = 0; i < files.size(); i=i+2)
    	{
    		LeftImg = imread(files[i].c_str());
    		RightImg = imread(files[i+2].c_str());
    	
    		namedWindow("left", WINDOW_NORMAL);
    		namedWindow("right", WINDOW_NORMAL);
    
    		imshow("left", LeftImg);
    		imshow("right", RightImg);
    
    		setMouseCallback("left", on_mouse1, (void*)&LeftImg);//调用回调函数 
    		setMouseCallback("right", on_mouse2, (void*)&RightImg);
    		waitKey();
    	}
    	destroyAllWindows();
    	return 0;
    }
    
    

    setmOusecallback函数的最后一个参数可以把图像传到on_mouse1()函数中,这样可以避免定义全局变量 。需要在on_mouse1()函数中添加一句代码 cv::Mat& RightImg = *(cv::Mat*) ustc;

    本工程目录下是由一张相机连续移动拍摄的多张图像,如下图所示。因此前后两张可以看做立体像,对图像进行选点操作。读者可以自己选择图像,进行选点操作练习。

    程序演示效果效果试下:上图为选点效果,下图对其中的点进行删除。

     

    展开全文
  • 上面已经讲到,最初的立体像是制作小幅面的立体摄影照片的,所以,它的用途局限于立体相机拍摄的立体人物图像。由于受到成本、幅面、运用领域的限制,大规模的制作立体图像并不成熟,其市场也仅仅限制在较小的研究...
  • 拿到一块面状的行政区划数据,要是直接使用fill-extrusion进行拉起的话,会将整个地区都进行拉起,这导致中间的区域也会被覆盖,中间的一些地图要素就不能显示出来了,同时mapbox-gl中的fill-extrusion,也不支持

    在地图的开发中设计效果中,使用行政区划的边界,将一个地区以墙的形式围起来,实现一个比较立体的展示效果。
    目前像一些互联网地图,都具有立体的观看形式,主要的作用,是实现建筑物的白模效果。
    在这里插入图片描述
    开源的mapbox-gl地图也具有实现立体观看的形式,在其中实现行政区划的方式如下:
    拿到一块面状的行政区划数据,要是直接使用fill-extrusion进行拉起的话,会将整个地区都进行拉起,这导致中间的区域也会被覆盖,中间的一些地图要素就不能显示出来了,同时mapbox-gl中的fill-extrusion,也不支持对边线数据的设置。
    所以,需要对行政区划的数据,做一些处理。
    首先,将行政区划的面状数据转换成线状数据,mapbox-gl也不支持将线状数据进行拉高的操作,这就还需要处理成面状的数据,使用空间操作的缓冲区,对线数据做一个缓冲区操作,将线数据处理成面状数据,这个使用arcmap或者qgis都能够进行处理。
    处理完成再将数据加载进行,进行fill-extrusion设置,效果如下:
    在这里插入图片描述
    更多文章请关注公众号支持!
    在这里插入图片描述

    展开全文
  • 通过计算全息方法每一幅二维图像计算得到相应的全息图,再现时将左右眼视图对应的全息图同时输出到两个空间光调制器进行实时光电再现,并使再现的位置符合人眼双目观察需要,计算机控制不同视角全息图顺序输出,...
  • 全息三维显示的信息量与再现的视差角与视场角的关系进行了分析,指出全息三维显示的巨大信息量是为了提供足够的视差和视场,以达到人眼立体视觉效果。在牺牲垂直视差并保证足够的水平视差角和视场角的条件下,...
  • 基于光源偏振补偿硅基液晶(LCOS)光学引擎的激光三维(3D)显示系统传统的LCOS光学引擎引起的偏振光损失进行了补偿,使经由照明系统进入光学引擎的不同偏振方向的激光全部参与成像,既可以实现激光3D立体显示,还提高...
  • 通过计算全息方法每一幅二维图像计算得到相应的全息图,再现时将左右眼视图对应的全息图同时输出到两个空间光调制器进行实时光电再现,并使再现的位置符合人眼双目观察需要,计算机控制不同视角全息图顺序输出,...
  • 一个量测同名点的程序是做为图像做定向的必要准备,为此我们开发了ImageMeasuringApparatus(图1),它是一款用来进行双像立体量测的程序,其功能有: 1、 影像显示和漫游; 2、 显示缩略图,进行手动粗定位;...

    一个量测同名点的程序是图像几何定向的必要准备,为此我们开发了ImageMeasuringApparatus(图1),它是一款用来进行双像立体量测的程序,其功能有:

    1、  影像对的显示和漫游;

    2、  显示缩略图,进行手动粗定位;

    3、  载入已量测点、手动亚像素级刺点。

    该程序源代码(VC++)和详细的开发说明文档(.doc)已经添加在了本人的资源里,可以下载查阅。

    图 1. ImageMeasuringApparatus运行界面

    下面我们阐述改程序的开发方法,通过学习本方法或许有助于加强对于MFC多视图图形界面程序开发的掌握:

    本程序是基于MFC的单文档应用程序,布局上采用分割窗口形式。其中涉及的主要的类有CMainFrame,CImageMeasuringApparatusDoc,CMeasuringView,CPhotoView以及CPhotoView2,另外还有一些对话框用来接收参数,原理简单此处不予介绍。

    CMainFrame类主要实现了主框架窗口的分割,分割方式如图2所示。

    CImageMeasuringApparatusDoc 类用来存储影像和量测点数据。

    CMeasuringView类用以显示缩略图,微调视图,并响应用户微调操作。

    CPhotoViewCPhotoView2类用以显示原始影像,相应用户漫游刺点等操作。

    图 2 窗口分割示意图

    下面通过操作实例来分析各类的关系:

    1、 打开影像,显示,漫游及粗定位。

    ①点击菜单或工具栏打开按钮,CImageMeasuringApparatusDoc类响应该消息,打开文件对话框接收用户输入的文件路径,利用OpenCV读取左右影像数据保存于m_img_l和m_img_r,并分别转换备份一个三通道影像m_l和m_r,以便后续处理。刷新视图。

    ②在CPhotoView和CPhotoView2的Ondraw函数中显示CImageMeasuringApparatusDoc保存的影像,注意转换坐标将其显示到视图中心。

    ③点击,就转换CMainFrame中保存的布尔型变量flag_drag的值为true,在CPhotoView和CPhotoView2中添加鼠标按下,拖放和释放的消息响应函数,在CMainFrame的flag_drag为true的情况下处理用户的漫游影像操作。

    ④在CMeasuringView的缩略图上按下左键,要将原始影像粗定位到相应位置。为此,在其LButtonDown中将按下点位置坐标转到原始影像,设置CPhotoView或CPhotoView2的offset变量,刷新视图,实现定位。

    2、 载入像点,显示像点。

    ①点击菜单或工具栏载入像点按钮,CImageMeasuringApparatusDoc类响应该消息,打开文件对话框接收用户输入的文件路径,读取左右影像像点数据保存在m_pt_l,m_pt_r,同时保存点数m_ptl_num和m_ptr_num。

    ②在CPhotoView ,CPhotoView2和CMeasuringView的m_overview_l和m_overview_r控件上实现显示像点的功能。首先像点坐标转换到这三个视图的坐标,然后在该坐标处画十字丝即可。

    3、 手动刺点,微调,保存所刺像点。

    ①点击刺点按钮,就转换CMainFrame中保存的布尔型变量flag_cross的值为true,在CPhotoView和CPhotoView2中添加鼠标按下,拖放和释放的消息响应函数,在CMainFrame的flag_drag为true的情况下处理用户的刺点操作。

    ②一旦触发刺点操作,就从原始影像上汲取触发点处为中心31*31范围的像素值保存在CMeasuringView的m_ptl_lpBits和m_ptr_lpBits中。

    ③CMeasuringView将m_ptl_lpBits和m_ptr_lpBits像素块显示在微调视图上,当用户点击微调按钮时调整offset_l和offset_r值,重绘微调视图上的图像。

    ④量点完毕,按下空格键时弹出输入点号对话框,输入点号后保存该点对于CImageMeasuringApparatusDoc的m_pt_l和m_pt_r.

    ⑤点击保存按钮,将保存CImageMeasuringApparatusDoc的m_pt_l和m_pt_r与当前文件夹下。

    图 3. 类视图

    以下是上述几个类的详细说明:

    1 CMainFrame

    成员变量:

       CSplitterWnd m_wndSplitter1;//窗口分割器1

       CSplitterWnd m_wndSplitter2;//窗口分割器2

       bool m_flag_drag;//是否按下拖动工具

       bool m_flag_cross;//是否按下刺点工具

    成员函数:

    virtual BOOL OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext);

    //分割窗口,分别是CPhotoView,CphotoView2,CMeasuringView类型窗口。

    virtual BOOL PreCreateWindow(CREATESTRUCT& cs);

    //设置窗口大小,取消最大化按钮

    afx_msg void OnBtnDrag();

    //按下拖动按钮的响应函数,设置变量m_flag_dragtrue

    afx_msg void OnUpdateBtnDrag(CCmdUI* pCmdUI);

    //设置工具按钮激活显示状态

    afx_msg void OnBtnCross();

    //按下刺点按钮的响应函数,设置变量m_flag_crosstrue

    afx_msg void OnUpdateBtnCross(CCmdUI* pCmdUI);

    //设置工具按钮激活显示状态

    2 CImageMeasuringApparatusDoc

    成员变量:

    CvvImage m_img_l;//原始左影像

    CvvImage m_img_r; //原始右影像

    IplImage *m_l; //3波段左影像

    IplImage *m_r; //3波段右影像

    IMAPOINT m_pt_l[5000]; //左影像量测点

    IMAPOINT m_pt_r[5000]; //右影像量测点

    int m_ptl_num;//左影像量测点数

    int m_ptr_num; //右影像量测点数

    成员函数:

    afx_msg void OnFileOpen();

    //打开影像得到m_img_l与m_img_r,然后将其转换为三波段的m_l与m_r,方便实现像点量测时精细调节视图显示。

    afx_msg void OnOpenPoints();

    //打开已量测点文件,保存左右影像量测点数以及像点坐标

    afx_msg void OnBtnSavept();

    //保存量测的点至当前文件

    typedef struct

    {

    int no;

    float x;

    float y;

    }IMAPOINT;

    3 CMeasuringView

    成员变量:

           CStatic   m_point_r; //右影像微调视图控件

           CStatic   m_point_l; //左影像微调视图控件

           CStatic   m_overview_r; //右影像缩略视图控件

           CStatic   m_overview_l; //左影像缩略视图控件

        double zoom_l,zoom_r; //缩略图放缩比例

           unsigned char *m_ptl_lpBits;//当前所刺点块像素值

           unsigned char *m_ptr_lpBits;//当前所刺点块像素值

           CPoint offset_l;//微调偏移量

           CPoint offset_r;//微调偏移量

    成员函数:

    virtual void OnDraw(CDC* pDC);

    //从Doc中读取影像数据,计算并保存缩略图放缩比例,在缩略图中画出左右影像缩略图,

    //从Doc中读取像点数据,根据缩略图显示方式及放缩比例换算到缩略图并画出十字丝显示

    //在微调视图中画出十字丝

    void AddPoints();

    //向Doc中保存量测点的数组m_pt_l以及m_pt_r加入新量测的点

    //m_pt_l以及m_pt_r由CPhotoView和CPhotoView2中m_pt以及CMeasuringView中的//offset_l核offset_r求和而得到。

    void DrawPoints(CDC *pDC, int flag);

    //在左右缩略图上画出所有像点,为pDC传入m_overview_l以及m_overview_r对应的DC,

    //flag相应为LEFT及RIGHT

    void DrawRedCross();

    //画出像点微调视图的中心十字丝

    void DrawPointView(int flag);

    //在微调视图中画出所刺的像点块,参数flag为LEFT或RIGHT. 利用API函数//StretchDIBits实现该功能,图像数据块为成员变量m_ptl_lpBits和m_ptr_lpBits。为了实//现微调功能,不能直接在m_point_l和m_point_r控件的pDC上画小影像块,而要先利用//兼容DC画出放大的影像并根据微调量移动到合适的位置,最后将其利用BitBlt直接复制//到原来的控件DC中即可。

    //要注意的是图像数据块的行宽必需为4的整数倍。

    virtual BOOL PreTranslateMessage(MSG* pMsg);

    //为了响应空格键按下时的消息,以便输入点号,重载该函数,在其中调用AddPoints()

    afx_msg void OnBtnLl();

    afx_msg void OnBtnLd();

    afx_msg void OnBtnLr();

    afx_msg void OnBtnLu();

    afx_msg void OnBtnRd();

    afx_msg void OnBtnRl();

    afx_msg void OnBtnRr();

    afx_msg void OnBtnRu();

    //响应微调按钮操作,微调小影像快并重绘

    afx_msg void OnLButtonDown(UINT nFlags, CPoint point);

    //在缩略视图中点击图像上某点,就把CPhotoView和CPhotoView2移动到相应的位置

    4 CPhotoView

    成员变量:

    CPoint offset;//大影像偏移量

    CPoint m_pt;//当前所刺的点

    CPoint oriPoint;//开始拖动影像时鼠标坐标

    bool m_flag_draging;//是否正在拖动影像

    成员函数:

    virtual BOOL PreTranslateMessage(MSG* pMsg);

    //为了响应空格键按下时的消息,以便输入点号,重载该函数,在其中调用CMeasuring类//的成员函数AddPoints()

    virtual void OnDraw(CDC* pDC);

    //将打开的左影像显示在窗口中心,采用双缓存方式:先用兼容DC显示然后直接复制

    afx_msg void OnLButtonDown(UINT nFlags, CPoint point);

    //左键按下时如果当前激活工具为拖动,则记录初始移动点位坐标,并捕获鼠标

    //左键按下时如果当前激活工具为刺点,则利用GetPtBits(CPoint point, unsigned char *lpBits)

    //获取当前点为中心31*31范围中的影像块像素值

    afx_msg void OnMouseMove(UINT nFlags, CPoint point);

    //鼠标移动时根据激活工具状态设置光标类型,如果状态为拖动则还要实时更新影像偏移量//同时重置拖动初始点位

    afx_msg void OnLButtonUp(UINT nFlags, CPoint point);

    //如果激活工具状态为拖动,则释放鼠标并设置m_flag_dragingfalse

    //如果激活工具状态为刺点,则在当前点画出十字丝,同时把当前点保存到m_pt

    CImageMeasuringApparatusDoc* GetDocument();

    //自添加的函数,用以获取文档类指针

    void GetPtBits(CPoint point, unsigned char *lpBits);

    //point换算到影像上然后取以相应点为中心31*31范围的像素值保存在lpBits

    void DrawPoints(CDC *pDC);

    //Doc中的点位数据显示在影像上。

    展开全文
  • 17.图像矫正程序。matelabe就可以运行,一个很简单的图像...实现立体像对的矫正,并将匹配点显示出来事先输入相机内外参数,进行校正,是第一幅图的照片。所以后面校正的加载有问题。 后面显示都是第一个图的视差图。
  • *在字里行间都流露出xx的喜爱之情,巧妙的运用了动态立体感知,让xx融于一年四季之间,有了时间的拉长,显示出了动态感和活力感,此外小作者一直怀着一颗不断探求未知的心,知识的渴望,祖国的热爱,让每位...
  • CT意为X线计算机断层摄影,是用X线束人体某部进行断层扫描,获得人体被检部的断面或立体图像。CT可以提供人体被检查部位的完整三维信息,可使器官和结构清楚显影,清楚地显示病变。就把一片面包切成片来看。 ...

    CT扫描 (Computed Tomography,CT)

      CT也称 CT扫描,是外科室的主要探查手段之一,对于层级较多的组织,采用CT较为合适,比如颈部、胸部、骨骼、肿瘤等通常会采用CT扫描。
      CT意为X线计算机断层摄影,是用X线束对人体某部进行断层扫描,获得人体被检部的断面或立体图像。CT可以提供人体被检查部位的完整三维信息,可使器官和结构清楚显影,清楚地显示病变。就像把一片面包切成片来看。
    CT扫描影片示例

    CT扫描设备图片

    CT成像原理

    CT扫描影片示例
      CT是用X射线束对人体某部一定厚度的层面进行扫描,由探测器接收透过该层面
    的X射线,转变为可见光后,由光电转换变为电信号,再经模拟/数字转换器(analog/digital converter)转为数字,输入计算机处理。
      图像形成的处理有如对选定层面分成若干个体积相同的长方体,称之为体素(voxel)。
      扫描所得信息经计算而获得每个体素的X射线衰减系数或吸收系数,再排列成矩阵,即数字矩阵(digital matrix),数字矩阵可存贮于磁盘或光盘中。经数字/模拟转换器(digital/analog converter)把数字矩阵中的每个数字转为由黑到白不等灰度的小方块,即像素(pixel),并按矩阵排列,即构成CT图像。所以,CT图像是重建图像。每个体素的X射线吸收系数可以通过不同的数学方法算出。
      CT的工作程序是这样的:它根据人体不同组织对X线的吸收与透过率的不同,应用灵敏度极高的仪器对人体进行测量,然后将测量所获取的数据输入电子计算机,电子计算机对数据进行处理后,就可摄下人体被检查部位的断面或立体的图像,发现体内任何部位的细小病变。

    CT扫描优缺点

    CT扫描优点

    • CT检查为横断面成像,可以经过图像重建,任意方位显示组织或器官,对病变显示更全面,防止遗漏;在肿瘤诊断的临床表现中具有很高的价值;
    • 具有高密度分辨率,对有密度改变的细微病变也能显示出来,CT增强可以进一步明确病变性质;

    CT扫描缺点

    • CT设备比较昂贵,检查费用偏高;
    • CT检查不足的是难以发现密度变化小或无的细小病变或局限于细胞水平的早期病变;
    • 运动及金属易产生伪影,影响诊断;
    • CT诊断辐射剂量较普通X线机大,会产生一定的电离辐射,孕妇不宜进行CT检查;

    核磁共振成像(Magnetic Resonance imaging,MRI)

      核磁共振成像(MRI)作为非侵入式检查手段,对软组织成像好,无辐射,对肌肉骨骼疾病的特异性和敏感度较高,适合对普通人群的常规检查,是预防脊柱退化性疾病的可靠检查手段。对肌肉和软组织的成像分辨率较高,便于诊断,主要用来观察神经、脊髓等椎管内软组织。
    核磁共振影像包括T1和T2 矢状面影像,以及T2 轴状位影像(FSE/TSE),如下图:
    核磁共振图像
    MR分为T1和T2

    成像原理

    核磁共振成像原理
      MRI通过对静磁场中的人体施加某种特定频率的射频脉冲,使人体中的氢质子受到激励而发生磁共振现象。停止脉冲后,质子在弛豫过程中产生MR信号。通过对MR信号的接收、空间编码和图像重建等处理过程,即产生MR信号。
      核磁共振成像原理:原子核带有正电,许多元素的原子核,如1H、19FT和31P等进行自旋运动。通常情况下,原子核自旋轴的排列是无规律的,但将其置于外加磁场中时,核自旋空间取向从无序向有序过渡。自旋的核同时也以自旋轴和外加磁场的向量方向的夹角绕外加磁场向量旋进,这种旋进叫做拉莫尔旋进,就像旋转的陀螺在地球的重力下的转动。自旋系统的磁化矢量由零逐渐增长,当系统达到平衡时,磁化强度达到稳定值。如果此时核自旋系统受到外界作用,如一定频率的射频激发原子核即可引起共振效应。这样,自旋核还要在射频方向上旋进,这种叠加的旋进状态叫做章动。在射频脉冲停止后,自旋系统已激化的原子核,不能维持这种状态,将回复到磁场中原来的排列状态,同时释放出微弱的能量,成为射电信号,把这许多信号检出,并使之能进行空间分辨,就得到运动中原子核分布图像。原子核从激化的状态回复到平衡排列状态的过程叫弛豫过程。它所需的时间叫弛豫时间。弛豫时间有两种即T1和T2,T1为自旋-点阵或纵向驰豫时间,T2为自旋-自旋或横向弛豫时间。

    MR扫描优缺点

    核磁共振MR优点

    • MR最大的优点是对人体不产生损害,没有电离辐射损伤;
    • 软组织和肌肉成像分辨率高,易于诊断;
    • 多方位成像,有助于解剖结构和病变显示,对椎管内病变、心脏病变的检查在临床价值相对较高;

    缺点

    • 成像时间较长;
    • MR设备费用高昂(最新7T MR设备售价高达5000万软妹币),检查费用偏高,一般用于非常规诊断;
    • 由于是磁场成像,容易受金属影像,生成伪影,影像诊断;
    • 采集时间较长、怀孕3个月内、有心脏病、有幽闭恐惧症的患者不适合进行MR诊断;

    持续更新中。。。

    展开全文
  • 近年来,随着智能手机、头盔立体显示等技术的发展和 普及,虚拟现实技术取得了飞速发展。在 VR 技术中场景建 模是最关键的一步。3D 游戏通常采用专业三维建模软件, 如 Autodesk Maya、Autodesk 3ds Max 等进行建模...
  • 插值模块、绘制模块和显示模块,并使用相关技术实现了各模块的功能。在详细叙 述插值模块的设计与实现的基础上,将基于轮廓形状的插值算法和其它一些插值算法 应用于系统中进行比较。实验结果表明基于轮廓形状的...
  • 脉动论坛Ⅲ.rar

    2019-08-30 05:54:48
    3. 个人相册,会员可以在个人相册里建立自己的簿,上传个人片,并自选是否与他人分享。 4. 带个股上市的股票系统(含全部的前台管理和设置)。 5. 可以记录所有事件的银行系统和服务中心。 6. 仿央视“开心辞典...
  • delphi 开发经验技巧宝典源码

    热门讨论 2010-08-12 16:47:23
    0268 动态显示像MDI的子窗体 177 0269 打开MDI窗体时其他窗体会显示出来的原因 177 8.4 窗体的大小及位置 178 0270 控制窗体的最大化、最小化 178 0271 无标题栏时改变窗体的大小 178 0272 无标题栏最大...
  • JavaScript网页特效范例宝典源码

    千次下载 热门讨论 2013-09-04 10:40:38
    实例001 打开新窗口显示广告信息 2 实例002 定时打开窗口 4 实例003 通过按钮创建窗口 5 实例004 自动关闭的广告窗口 6 实例005 控制弹出窗口居中显示 7 实例006 弹出的窗口之Cookie控制 9 实例007 为弹出的窗口加入...
  • 实例068 鼠标经过表格时,显示提示信息 3.3 鼠标样式 实例069 显示自定义的鼠标形状 实例070 动画光标 3.4 文字及列表样式 实例071 应用删除线样式标记商品特价 实例072 在文字上方标注说明标记 实例073 ...
  • 商品详细信息下方显示其他用户的留言,并且已经登录的用户可以这件商品进行评论,商品发布者可以在下方查看留言,并且与有意者打成交易意向。商品发布者可以在下方查看留言,并且与有意者打成交易意向。 2.1.4 站...
  • 实例003 开始菜单一样漂亮的菜单 4 实例004 任务栏托盘菜单 4 实例005 可以拉伸的菜单界面 5 实例006 级联菜单 6 1.2 工具栏设计 6 实例007 带背景的工具栏 7 实例008 浮动工具栏 7 实例009 带下拉菜单的工具栏 8 ...
  • (6)3D音效:TS3现在具有完整的3D音效支持,通过设置,不同人的声音可以定位到不同的空间位置,自己可以处在一个立体三维空间的任意点上,听到前后左右不同方位传来的声音。如果您的音箱/耳机支持5.1或7.1声道,将...
  • (6)3D音效:TS3现在具有完整的3D音效支持,通过设置,不同人的声音可以定位到不同的空间位置,自己可以处在一个立体三维空间的任意点上,听到前后左右不同方位传来的声音。如果您的音箱/耳机支持5.1或7.1声道,将...
  • C#程序开发范例宝典(第2版).part02

    热门讨论 2012-11-12 07:55:11
    实例003 开始菜单一样漂亮的菜单 4 实例004 任务栏托盘菜单 4 实例005 可以拉伸的菜单界面 5 实例006 级联菜单 6 1.2 工具栏设计 6 实例007 带背景的工具栏 7 实例008 浮动工具栏 7 实例009 带下拉菜单的...
  • C#程序开发范例宝典(第2版).part13

    热门讨论 2012-11-12 20:17:14
    实例003 开始菜单一样漂亮的菜单 4 实例004 任务栏托盘菜单 4 实例005 可以拉伸的菜单界面 5 实例006 级联菜单 6 1.2 工具栏设计 6 实例007 带背景的工具栏 7 实例008 浮动工具栏 7 实例009 带下拉菜单的...
  • 实例003 开始菜单一样漂亮的菜单 4 实例004 任务栏托盘菜单 4 实例005 可以拉伸的菜单界面 5 实例006 级联菜单 6 1.2 工具栏设计 6 实例007 带背景的工具栏 7 实例008 浮动工具栏 7 实例009 带下拉菜单的...
  • 实例003 开始菜单一样漂亮的菜单 4 实例004 任务栏托盘菜单 4 实例005 可以拉伸的菜单界面 5 实例006 级联菜单 6 1.2 工具栏设计 6 实例007 带背景的工具栏 7 实例008 浮动工具栏 7 实例009 带下拉菜单的...

空空如也

空空如也

1 2 3 4
收藏数 63
精华内容 25
关键字:

显示立体像对