《数字图像处理-OpenCV/Python》连载:图像变换、重建与复原
本书京东 优惠购书链接 https://item.jd.com/14098452.html
本书CSDN 独家连载专栏 https://blog.csdn.net/youcans/category_12418787.html
第 13 章 图像变换、重建与复原
图像变换是指利用图像在变换空间的特殊性质,通过数学变换将图像从一个空间变换到另一个空间,以便进行分析和处理。图像复原是指利用退化过程的先验知识,沿着图像退化的逆过程复原,补偿退化过程造成的失真,由退化图像恢复并重建原始图像,以改善图像质量。
本章内容概要
- 学习极坐标变换、霍夫变换和雷登变换。
- 学习基于霍夫变换的直线检测和圆检测方法。
- 介绍基于雷登变换的反投影图像重建。
- 介绍退化图像复原的算法,如逆滤波、维纳滤波和最小二乘法滤波算法。
13.1 直角坐标与极坐标变换
在二维平面中,确定一个点的位置需要两个独立的参数。二维图像由像素点组成的矩阵来描述,在直角坐标系中用行与列来确定像素的位置。
常用的曲线,如圆和椭圆的方程在极坐标系下都具有特殊的性质,与角度相关的算法通常都需要使用极坐标系。直角坐标与极坐标的相互转化,是很多图像处理算法的基础。
OpenCV中的函数cv.cartToPolar用于将直角坐标(笛卡儿坐标)转换为极坐标,函数 cv.polarToCart用于将极坐标转换为直角坐标(笛卡儿坐标)。函数cv.magnitude与函数cv.phase用于计算直角坐标的幅值与相位。
函数原型
cv.cartToPolar(x, y[, magnitude, angle, angleInDegrees]) → magnitude, angle
cv.polarToCart(magnitude, angle[, x, y, angleInDegrees]) → x, y
cv.magnitude(x, y[, magnitude]) → magnitude
cv.phase(x, y[, angle, angleInDegrees]) → angle
函数cv.cartToPolar能实现将原点移动到变换中心后的直角坐标向极坐标的转换,函数cv.polarToCart能实现将原点移动到变换中心后的极坐标向直角坐标的转换。转换公式如下。
参数说明
- x、y:直角坐标系的横坐标、纵坐标,是Numpy数组,浮点型数据。
- magnitude、angle:极坐标系的幅值、角度,是Numpy数组,浮点型数据。
- angleInDegrees:角度选项,默认值为0,表示弧度制,可选值1表示角度制。
注意问题
- (1) 函数cv.cartToPolar的返回值magnitude、angle与输入值x、y的尺寸和类型相同,函数cv.polarToCart的返回值x、y与输入值magnitude、angle的尺寸和类型相同。
- (2) 函数cv.cartToPolar输入参数中的可选项magnitude、angle用于指定变换中心的极坐标。类似地,函数cv.polarToCart输入参数中的可选项x、y用于指定变换中心的直角坐标。
- (3) 极坐标与直角坐标的变换在数学上是可逆的,但在函数变换时存在精度误差,角度计算精度约为0.3度,坐标计算精度约为e-6。
【例程1301】极坐标中的环形图案和文字校正
以圆心为变换中心,直角坐标系中的圆周像素在极坐标系中显示为一条直线。
本例程通过极坐标变换将环形图案变换到极坐标系,实现环形布局文字图案的校正。
python
# 【1301】极坐标中的环形图案和文字校正
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
if __name__ == '__main__':
img = cv.imread("../images/Fig1301.png") # 读取彩色图像(BGR)
h, w = img.shape[:2] # 图像的高度和宽度
cx, cy = int(w/2), int(h/2) # 以图像中心点作为变换中心
maxR = max(cx, cy) # 最大变换半径
imgPolar = cv.linearPolar(img, (cx, cy), maxR, cv.INTER_LINEAR)
imgPR = cv.rotate(imgPolar, cv.ROTATE_90_COUNTERCLOCKWISE)
imgRebuild = np.hstack((imgPR[:,w//2:], imgPR[:,:w//2]))
print(img.shape, imgRebuild.shape)
plt.figure(figsize=(9, 3.5))
plt.subplot(131), plt.axis('off'), plt.title("1. Original")
plt.imshow(cv.cvtColor(img, cv.COLOR_BGR2RGB))
plt.subplot(132), plt.axis('off'), plt.title("2. Polar Transform")
plt.imshow(cv.cvtColor(imgPolar, cv.COLOR_BGR2RGB))
plt.subplot(133), plt.axis('off'), plt.title("3. Polar Rebuild")
plt.imshow(cv.cvtColor(imgRebuild, cv.COLOR_BGR2RGB))
plt.tight_layout()
plt.show()
程序说明:
-(1) 运行结果,极坐标中的环形图案和文字校正如图13-1所示。图13-1(1)所示为原始图像,图中的文字和图案环绕排列。
-(2) 图13-1(2)所示为对图13-1(1)以圆心为中心进行极坐标变换的结果,极坐标的角度与半径分别对应直角坐标的纵坐标与横坐标。
-(3) 图13-1(3)所示为对图13-1(2)进行旋转和平移处理的结果。原始图像中环形排列的文字,在图13-1(3)所示的变换图像中水平排列,便于识别和检测。
图13-1 极坐标中的环形图案和文字校正
版权声明:
youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/136525483)
Copyright 2024 youcans, XUPT
Crated:2024-03-06
《数字图像处理-OpenCV/Python》 独家连载专栏 : https://blog.csdn.net/youcans/category_12418787.html