【python图像处理】极坐标变换及插值算法

xiaoxiao2021-02-27  117

 

图像极坐标变换及基于OpenCV的实现一文中,介绍了图像极坐标变换的基本原理和基于opencv的实现,这里我们再介绍一下基于python的实现,以及在极坐标变换中所用的几种常用的插值算法,即最邻近插值、双线性插值以及三次卷积插值。

直接看代码:

import numpy as np #输入参数src: 源图像矩阵(方图,笛卡尔坐标) #输入参数d: 目标图像直径 #返回:dst:目标图像矩阵(圆图,极坐标) def polar_transform(src, d): #初始换目标图像矩阵 dst = np.zeros((d, d), dtype = float) rows, cols = src.shape #径向步长 delta_r = sample_num/((d - 1)/2.0) #切向(旋转角度)步长 delta_t = 2.0*np.pi/line_num ox = (d - 1)/2.0 oy = (d - 1)/2.0 for i in range(0, d, 1): for j in range(0, d, 1): rx = j - ox ry = i - oy r = np.sqrt(np.power(rx, 2) + np.power(ry, 2)) if (r > rmin) & (r <= (d - 1)/2.0): t = np.arctan2(ry, rx) if t < 0: t = t + 2.0*np.pi ri = r*delta_r rf = np.int_(np.floor(ri)) rc = np.int_(np.ceil(ri)) if rf < 0: rf = 0 if rc > rows - 1: rc = rows - 1 ti = t/delta_t tf = np.int_(np.floor(ti)) tc = np.int_(np.ceil(ti)) if tf < 0: tf = 0 if tc > cols - 1: tc = cols - 1 #选择相应的插值算法 #dst[i][j] = interpolate_adjacent(src, ri, rf, rc, ti, tf, tc) dst[i][j] = interpolate_bilinear(src, ri, rf, rc, ti, tf, tc) #dst[i][j] = interpolate_bitriple(src, ri, rf, rc, ti, tf, tc, rows, cols) return dst ####最邻近插值算法 def interpolate_adjacent(src, ri, rf, rc, ti, tf, tc): r = 0 t = 0 if (ri - rf) > (rc - ri): r = rc else: r = rf if (ti - tf) > (tc - ti): t = tc else: t = tf out = src[r][t] return out ####双线性插值 def interpolate_bilinear(src, ri, rf, rc, ti, tf, tc): if rf == rc & tc == tf: out = src[rc][tc] elif rf == rc: out = (ti - tf)*src[rf][tc] + (tc - ti)*src[rf][tf] elif tf == tc: out = (ri - rf)*src[rc][tf] + (rc - ri)*src[rf][tf] else: inter_r1 = (ti - tf)*src[rf][tc] + (tc - ti)*src[rf][tf] inter_r2 = (ti - tf)*src[rc][tc] + (tc - ti)*src[rc][tf] out = (ri - rf)*inter_r2 + (rc - ri)*inter_r1 return out ####三次卷积算法 def interpolate_bitriple(src, ri, rf, rc, ti, tf, tc, rows, cols): rf_1 = rf - 1 rc_1 = rc + 1 tf_1 = tf - 1 tc_1 = tc + 1 if rf_1 < 0: rf_1 = 0 if rc_1 > rows - 1: rc_1 = rows - 1 if tf_1 < 0: tf_1 = 0 if tc_1 > cols - 1: tc_1 = cols - 1 if rf == rc & tc == tf: out = src[rc][tc] elif tf == tc: A = np.array([(4 - 8*(ri - rf + 1) + 5*np.power(ri - rf + 1, 2) - np.power(ri - rf + 1, 3)), (1 - 2*np.power((ri - rf), 2) + np.power((ri - rf), 3)), (1 - 2*np.power((rc - ri), 2) + np.power((rc - ri), 3)), (4 - 8*(rc - ri + 1) + 5*np.power(rc - ri + 1, 2) - np.power(rc - ri + 1, 3))]) B = np.array([[src[rf_1][tf]], [src[rf][tf]], [src[rc][tc]], [src[rc_1][tc]]]) out = np.dot(A, B) elif rf == rc: B = np.array(src[rf][tf_1], src[rf][tf], src[rf][tc], src[rf][tc_1]) C = np.array([[(4 - 8*(ti - tf + 1) + 5*np.power(ti - tf + 1, 2) - np.power(ti - tf + 1, 3))], [(1 - 2*np.power((ti - tf), 2) + np.power((ti - tf), 3))], [(1 - 2*np.power((tc - ti), 2) + np.power((tc - ti), 3))], [(4 - 8*(tc - ti + 1) + 5*np.power(tc - ti + 1, 2) - np.power(tc - ti + 1, 3))]]) out = np.dot(B, C) else: A = np.array([(4 - 8*(ri - rf + 1) + 5*np.power(ri - rf + 1, 2) - np.power(ri - rf + 1, 3)), (1 - 2*np.power((ri - rf), 2) + np.power((ri - rf), 3)), (1 - 2*np.power((rc - ri), 2) + np.power((rc - ri), 3)), (4 - 8*(rc - ri + 1) + 5*np.power(rc - ri + 1, 2) - np.power(rc - ri + 1, 3))]) B = np.array([[src[rf_1][tf_1], src[rf_1][tf], src[rf_1][tc], src[rf_1][tc_1]], [src[rf][tf_1], src[rf][tf], src[rf][tc], src[rf][tc_1]], [src[rc][tf_1], src[rc][tf], src[rc][tc], src[rc][tc_1]], [src[rc_1][tf_1], src[rc_1][tf], src[rc_1][tc], src[rc_1][tc_1]]]) C = np.array([[(4 - 8*(ti - tf + 1) + 5*np.power(ti - tf + 1, 2) - np.power(ti - tf + 1, 3))], [(1 - 2*np.power((ti - tf), 2) + np.power((ti - tf), 3))], [(1 - 2*np.power((tc - ti), 2) + np.power((tc - ti), 3))], [(4 - 8*(tc - ti + 1) + 5*np.power(tc - ti + 1, 2) - np.power(tc - ti + 1, 3))]]) out = np.dot(np.dot(A, B), C) return out

2017.05.05

转载请注明原文地址: https://www.6miu.com/read-15855.html

最新回复(0)