专栏地址: 『youcans 的 OpenCV 例程 300篇 - 总目录』
【第 7 章:图像复原与重建】
110. 投影和雷登变换
111. 雷登变换反投影重建图像
112. 滤波反投影重建图像
图像重建(Image Reconstruction)的基本思想,就是通过探测物体的投影数据,重建物体的实际内部构造。
断层成像就是要获得物体内部的截面图像。利用 X射线、超声波等射线穿透被遮挡物体的透视投影图,可以计算恢复物体的断层图,进而可以利用断层图或直接从二维透视投影图重建物体的形状和内部结构。其原理是射线在穿过不同组织时的吸收率不同,在成像面上得到不同的投射强度,由此反演求得内部分布的图像。
X 射线、CT 技术就是应用断层重建的医学诊断方法。计算机断层扫描(CT)已经发展成为一种非常成功和必不可少的医学诊断工具,被认为是 X 射线发现以来医学影像领域最伟大的发明。
X 射线计算机断层成像的基本原理是:使用 X 射线从多个不同方向和角度对物体进行扫描,通过反投影算法获取物体内部结构的切片,堆叠这些切片就可以得到人体的三维表示。
投影重建还应用于地矿探测,接收不同地层和矿体反射的超声波, 按照超声波在媒质的透射率和反射规律,对透射投影图进行分析计算,就可以恢复重建地下的矿体形状。
雷登变换是三维重建的数学基础。
g(\rho, \theta) = \int ^{+\infty}_{-\infty} \int ^{+\infty}_{-\infty} f(x,y) \ \delta(x cos \theta + y sin \theta - \rho) dxdy g ( ρ , θ ) = ∫ − ∞ + ∞ ∫ − ∞ + ∞ f ( x , y ) δ ( x cos θ + ys in θ − ρ ) d x d y
雷登变换将二维空间
# # 9.23: 雷登变换正弦图
from scipy import ndimage
def discreteRadonTransform(image, steps):
channels = image.shape[0]
res = np.zeros((channels, channels), dtype=np.float32)
for s in range(steps):
rotation = ndimage.rotate(image, -s * 180/steps, reshape=False).astype(np.float32)
res[:, s] = sum(rotation)
return res
# # 读取原始图像
plt.figure(figsize=(9, 7))
fileImg = ["Fig0534a.tif", "Fig0534b.tif", "Fig0534c.tif"] # 原始图像 文件名
for i in range(len(fileImg)):
img = cv2.imread("../images/"+fileImg[i], flags=0) # flags=0 读取为灰度图像
imgRadon = discreteRadonTransform(img, img.shape[0]) # Radon 变换
print(img.shape, imgRadon.shape)
plt.subplot(2, len(fileImg), i + 1), plt.axis('off') # 绘制原始图像
plt.title("origin image"), plt.imshow(img, 'gray')
plt.subplot(2, len(fileImg), i + len(fileImg) + 1), plt.axis('off') # 绘制 sinogram 图
plt.title("Radon transform"), plt.imshow(imgRadon, 'gray')
plt.tight_layout()
plt.show()
(本节完)
雷登变换是三维重建的数学基础。雷登变换将二维空间 $xy$ 映射到了另一个二维空间 $\alpha s$,称为直线空间。雷登变换常被用于医学影像处理,利用反雷登变换可以进行三维图像重建。
首先,我说说为什么想做一个图像中心点的正弦图。
当我们照CT的时候,考虑一个二维平面,如果物体永远放置在扫描仪的正中心,那么这个二维物体这正中心,一定是最中间的那个光子探测器探测到的。所以,无论光子以如何的角度投射这个物体(二维),如果我们只讨论中心位置的话,那只用考虑中间那个探测器的值就行了。
(好吧,我承认我这么写是为了偷懒。但是只有实现了最理想的...
转载自:http://www.cnblogs.com/pakfahome/p/3914318.html给源图像增加边界cv2.copyMakeBorder(src,top, bottom, left, right ,borderType,value)
src:源图像top,bottem,left,right: 分别表示四个方向上边界的长度borderType: 边界的类型有以下几种:
BORDER_
图像的八种变换1. 图像放大、缩小1.1 放大1.2 缩小2. 图像平移2.1 向右下平移2.1 向左上平移3. 图像旋转4. 图像仿射变换5. 图像裁剪6. 位运算(AND,OR,XOR)6.1AND(与运算)6.2 OR(或运算)7. 图像的分离和融合7.1 分离7.2 融合8. 颜色空间8.1 灰度8.2 HSV(色度、饱和度、纯度)8.1 lab
1. 图像放大、缩小
import cv2
import matplotlib.pyplot as plt
import numpy as np
1.https://zhuanlan.zhihu.com/p/79722768
2.https://blog.csdn.net/qq_33837704/article/details/79504530
3.https://blog.csdn.net/yu132563/article/details/99228303
图像投影,就是说将图像在某一方向上做线性积分(或理解为累加求和)。如果将图像看成二维函数f(x, y),则其投影就是在特定方向上的线性积分,比如f(x, y)在垂直方向上的线性积分就是其在x轴上的投影;f(x, y)在水平方向上的线积分就是其在y轴上的投影。通过这些投影,可以获取图像在指定方向上的突出特性,这在图像模式识别等处理中可能会用到。
Radon变换(拉东变换),就是将数字图像矩
opencv_world454d.dll和opencv_aruco343d.lib opencv_bgsegm343d.lib opencv_bioinspired343d.lib opencv_calib3d343d.lib opencv_ccalib343d.lib opencv_core343d.lib
"opencv_world454d.dll"是OpenCV库的一个打包文件,包含了所有模块和功能的代码。而"opencv_aruco343d.lib"、"opencv_bgsegm343d.lib"、"opencv_bioinspired343d.lib"、"opencv_calib3d343d.lib"、"opencv_ccalib343d.lib"、"opencv_core343d.lib"等是OpenCV库的单独模块,每个模块对应一个库文件。
如果您的应用程序需要使用OpenCV的所有模块和功能,那么可以使用"opencv_world454d.dll",这样可以简化链接过程。如果您只需要使用其中的某些模块和功能,那么可以使用对应的库文件。在链接时,您需要将需要使用的库文件添加到项目中,这样编译器就可以找到并链接这些库文件。
请注意,库文件的名称和版本号会随着OpenCV版本的更新而变化。在使用库文件时,需要根据实际情况选择正确的库文件。