Pyhton变量变换原理

我们在C语言中实现变量交换,往往会使用到通过中间变量来交换两个变量的值:

tmp = x;
x = y;
y = tmp;

而在python中,则无需中间变量即可实现:

x , y = y, x

看起来很神奇,那么具体实现机制是什么呢?
将这个之前,我们先来了解python的多元赋值机制(《python核心编程3.2》)。通常形式是这样的:

x, y , z = 1, 2, 'a string'

采取这种方式的赋值是,等号两边的对象其实都是元祖,即:

(x, y, z) = (1, 2, 'a string')

变量名x, y, z都是引用,内存开辟除了三个空间分别存储1, 2, 'a string',三个变量分别指向这三块地址。由这三个变量构造的元组tuple,它有三个元素,这三个元素并不是x,y,z这三个变量,而是这三个变量所指向的地址空间里的内容。如果此时再另x=4,此时在地址空间会另开辟出一块空间存储4,x进而指向这块空间,而元组内的三个值仍保持不变。
接着我们来解读x, y = y, x, 同样, 它等价于(x, y) = (y, x)。
运行时,首先构造一个元组(y, x),然后构造另一个元组(x, y),接着用元组(y, x)赋值给(x, y),元组赋值过程从左到右,依次进行。假如x=1,y=2,先令x=y,此时x=2,然后令y=x,y等于1。

### Python 中霍夫变换进行直线检测的原理 霍夫变换是一种用于图像处理中的特征提取技术,特别适用于从噪声背景中识别几何形状。对于直线检测而言,霍夫变换通过参数空间转换来实现[^1]。 在笛卡尔坐标系下表示一条直线需要两个变量 \(y=mx+b\) ,其中 m 是斜率而 b 则代表截距。然而,在实际应用中这种表达方式存在局限性——垂直线无法被定义因为其斜率为无穷大。因此引入极坐标形式 \(\rho=x\cos{\theta}+y\sin{\theta}\),这里 ρ 表示原点到该直线上任意一点的距离;θ 为这条垂线与 X 轴正方向之间的夹角[^2]。 当给定一幅二值化边缘图像是,每条边上的像素都会映射成参数空间 (\(ρ, θ\)) 的一个曲线。如果多条这样的曲线相交于同一点,则意味着这些原始图片上对应的点共属于某一直线。为了找到这样具有共同交点的位置,通常会创建累加器数组 (accumulator array) 来记录各个候选位置处的支持票数。最终那些获得足够高支持度的地方即对应着可能存在的真实线条[^3]。 ```python import numpy as np from skimage.transform import hough_line, hough_line_peaks import matplotlib.pyplot as plt from scipy import ndimage as ndi def plot_hough_transform(image): # Classic straight-line Hough transform between 0.1*max and max distance. tested_angles = np.linspace(-np.pi / 2, np.pi / 2, 360) hspace, theta, dist = hough_line(image) fig, axes = plt.subplots(1, 3, figsize=(15, 6)) ax = axes.ravel() ax[0].imshow(image, cmap=plt.cm.gray) ax[0].set_title('Input image') ax[0].set_axis_off() angle_step = theta[1] - theta[0] d_theta = np.degrees(angle_step) ax[1].imshow( np.log(1 + hspace), extent=[np.rad2deg(theta[-1], dist[0]], cmap='gray', aspect=1/1.5) ax[1].set_title('Hough transform') ax[1].set_xlabel('Angles (degrees)') ax[1].set_ylabel('Distance (pixels)') ax[1].axis('image') ax[2].imshow(image * 0, cmap='gray') origin = np.array((0, image.shape[1])) for _, angle, dist in zip(*hough_line_peaks(hspace, theta, dist)): y0, y1 = (dist - origin * np.cos(angle)) / np.sin(angle) ax[2].plot(origin, (y0, y1), '-r') ax[2].set_xlim(origin) ax[2].set_ylim((image.shape[0], 0)) ax[2].set_axis_off() ax[2].set_title('Detected lines') plt.tight_layout() plt.show() if __name__ == "__main__": from skimage.data import moon img_edges = ndi.gaussian_filter(moon(), sigma=2.0) edges = canny(img_edges, low_threshold=1, high_threshold=25) plot_hough_transform(edges) ``` 此代码片段展示了如何利用 `skimage` 库执行霍夫变换并可视化结果。首先加载了一张测试图像,并对其进行预处理得到边界信息。接着调用了 `hough_line()` 函数计算霍夫空间内的累积投票矩阵,最后绘制出所发现的所有潜在直线[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值