添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

专栏地址: 『youcans 的 OpenCV 例程 300篇 - 总目录』

【第 7 章:图像复原与重建】
110. 投影和雷登变换
111. 雷登变换反投影重建图像
112. 滤波反投影重建图像

【youcans 的 OpenCV 例程 300 篇】111. 雷登变换反投影重建图像

7. 投影重建图像

图像重建的基本思想,就是通过探测物体的投影数据,重建物体的实际内部构造。

7.2 雷登变换反投影重建图像(Radon transform back projection)

空间点 X 通过摄像机 P 被作用到图像平面的图像点 m = PX , 获得采集到的图像数据,这种投影关系称为摄像机的正向投影 (forward projection) ,简称投影。

反向投影是针对图像平面的基本几何元素而言的,图像平面点 m 的反投影是指在摄像机 P 的作用下具有像点 m 的所有空间点的集合。

反投影一个点形成部分图像的过程,是将直线

    # 9.24: 雷登变换反投影重建图像
    from scipy import ndimage
    def discreteRadonTransform(image, steps):  # 离散雷登变换
        channels = image.shape[0]
        resRadon = np.zeros((channels, channels), dtype=np.float32)
        for s in range(steps):
            rotation = ndimage.rotate(image, -s * 180/steps, reshape=False).astype(np.float32)
            resRadon[:, s] = sum(rotation)
        return resRadon
    def inverseRadonTransform(image, steps):  # 雷登变换反投影
        channels = image.shape[0]
        res = np.zeros((steps, channels, channels))
        for s in range(steps):
            expandDims = np.expand_dims(image[:, s], axis=0)
            repeat = expandDims.repeat(channels, axis=0)
            res[s] = ndimage.rotate(repeat, s * 180/steps, reshape=False).astype(np.float32)
        invRadon = np.sum(res, axis=0)
        return invRadon
    # 读取原始图像
    img1 = cv2.imread("../images/Fig0534a.tif", 0)  # flags=0 读取为灰度图像
    img2 = cv2.imread("../images/Fig0534c.tif", 0)
    # 雷登变换
    imgRadon1 = discreteRadonTransform(img1, img1.shape[0])  # Radon 变换
    imgRadon2 = discreteRadonTransform(img2, img2.shape[0])
    # 雷登变换反投影
    imgInvRadon1 = inverseRadonTransform(imgRadon1, imgRadon1.shape[0])
    imgInvRadon2 = inverseRadonTransform(imgRadon2, imgRadon2.shape[0])
    plt.figure(figsize=(9, 7))
    plt.subplot(231), plt.axis('off'), plt.title("origin image"), plt.imshow(img1, 'gray')  # 绘制原始图像
    plt.subplot(232), plt.axis('off'), plt.title("Radon transform"), plt.imshow(imgRadon1, 'gray')  # 绘制 sinogram 图
    plt.subplot(233), plt.axis('off'), plt.title("Inv-Radon transform"), plt.imshow(imgInvRadon1, 'gray')
    plt.subplot(234), plt.axis('off'), plt.title("origin image"), plt.imshow(img2, 'gray')
    plt.subplot(235), plt.axis('off'), plt.title("Radon transform"), plt.imshow(imgRadon2, 'gray')
    plt.subplot(236), plt.axis('off'), plt.title("Inv-Radon transform"), plt.imshow(imgInvRadon2, 'gray')
    plt.tight_layout()
    plt.show()

(本节完)

由于CT在医院里已经起到很大的作用,为所有人带来前所未有的好处,那么深入地学习这种技术,以便设计出更好的CT机器,造福人类,永远是一个方向。在CT技术里,有一个从光电感应之后成像的问题要处理,就是从接收到X光的照片里重构原始图像出来,在这个重构的过程中要使用到radon变换,这个变换非常重要。下面就来使用OpenCV的函数来实现这样的变换: #python 3.7.4,opencv4.1 #蔡...
1.原理: Radon变换用来计算图像矩阵在特定方向上的投影。二维函数投影是一组线积分,Radon变换计算一定方向上平行线的积分,平行线的间隔为1个像素。Radon变换可以旋转图像的中心到不同角度,来获得图像在不同方向上的投影积分。下图是矩形图像在[0,180]度区间的Radon变换: 2、应用: 使用Radon变换检测直线检测步骤如下: (1)使用边缘检测函数edge函数计算二值图像
openCV笔记——直方图反向投射(Back Projection)详解 **(本人近期学习图像处理,一路遇到许多问题,多亏得到许多博主博客指点,感激不尽。现学到直方图反向投射,花了半天时间终于搞懂了,故第一次写此博客记录,如有错误,请网友指正) 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可...
最近在做停车位检测,看到一论文介绍的方法是使用radon 变换检测直线. 鉴于大多数博客基于matlab实现(matlab有相应函数),而我的工程是基于c++的,故费心思找到了此实现方法。 代码来源地址:https://github.com/opencv/opencv_contrib/pull/549 作者是将源码上传到opencv_contrib库,方便在opencv 编译安装同时一起编译...
1 反向投影 如果一幅图像的区域中显示的是一种结构纹理或者一个独特的物体,那么这个区域的置方图可以看作一个概率函数,其表现形式是某个像素属于该纹理或物体的概率。 反向投影:是一种记录给定图像中的像素点如何适应直方图模型像素分布方式的一种方法。简单的讲,就是计算某一特征的直方图模型,然后使用模型去寻找图像中存在的该特征的方法。 1.1 反向投影的工作原理 使用模型直方图来检测测试图像中的区域,检测步骤: (1)对测试图像中的每个像素(p(i, j)),获取色调数据并找到该色调(hi,j,si,j)(h_{i,