图像矫正:桶形畸变矫正的原理及python简易实现与加速

更新时间:2023-07-09 06:03:53 阅读: 评论:0

图像矫正:桶形畸变矫正的原理及python简易实现与加速
这篇⽂章主要讲解桶形畸变矫正,⾸先介绍⼀下相关背景。
Radial Distortion
尽管畸变可能是没有规律或遵循某种模式的,但⼀般情况下我们遇到的最多的情况是畸变呈放射状且是对称的,其主要产⽣于相机镜头的畸变。这种呈放射状的、对称的畸变,即radial distortion主要可以分为两种,barrel distortion(桶形畸变)以及pincushion
distortion(枕型畸变)。
它们的表现如下图所⽰,
畸变种类效果说明
桶形畸变桶形畸变中,从图像的中⼼点到图像的边缘点图像的相对⼤⼩逐渐变⼩,看起来就像把⼀张正常⼤⼩的图⽚包裹在⼀个球上⼀样。鱼眼相机,就是利⽤这种类型的畸变将⼀个⽆限宽的物体平⾯映射成有限的图像区域来呈现出⼀种半球形状的效果的。当使⽤变焦镜头时如果把焦距调⾄镜头的中段就会出现桶形畸变,此外使⽤⼴⾓镜头时桶形畸变的效果最明显。
枕型畸变枕型畸变中,从图像的中⼼点到图像的边缘点图像的相对⼤⼩逐渐变⼤,看起来的效果就像是把⼀张正常⼤⼩的图⽚贴在球的内壁,像⼀个枕头。
胡⼦型畸变胡⼦型畸变是以上两种畸变的混合,有时也叫做混合型畸变。从中⼼向边缘扩散的过程中,畸变种类也从桶形畸变变成了枕型畸变。正因为在图⽚的上半部分中的直线变得像胡⼦形状⼀样,所以我们称其为“胡⼦型畸变”(Mustache distortion)。
从数学上来说,桶形畸变和枕型畸变都是⼆次的,意味着畸变程度与点到中⼼点之间的距离的⼆次⽅成正⽐。在胡⼦型畸变中,四次⽅项是显著的,是因为在中⼼处,桶形畸变(⼆次⽅)占主要影响,⽽在边缘处四次⽅的枕型畸变占上⽅。
Software Correction
参数解释,
此处的参数定义同上⾯那个公式相同。对于放射状畸变⽽⾔,除法模型⽐Brown-Conrady模型更受欢迎,主要是因为它可以使⽤更少的参数达到更好的效果。使⽤除法模型,对⼤多数相机⽽⾔⼀个调整项就已经⾜够了。
Python代码实现
from PIL import Image
import numpy as np
import imageio
import math
import cv2
import time
def read_image_return_nparray(fname):
合作协议范本"""
open image u Image and convert it into np.array
:param fname: image file name
:return: np.array(image)
"""
image = Image.open(fname)
image_array = np.array(image)
return image_array
def read_color_image_as_gray_return_nparray(fname):
image = cv2.imread(fname)
original_gray_image = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
return original_gray_image
def get_image_height_and_width_and_channels(image_array):
return image_array.shape[1], image_array.shape[0], image_array.shape[2]
def barrel_correction(distorted_image, image_width, image_height, paramA, paramB, paramC, paramD):
distorted_image_copy = distorted_image
福州景点d = int(min(image_width, image_height) / 2)
center_x = (image_width - 1) / 2.0
center_y = (image_height - 1) / 2.0
for x in range(image_width):
个人网站设计
工作评价怎么写for y in range(image_height):
delta_x = (x - center_x) / d
delta_y = (y - center_y) / d
dst_r = np.sqrt(delta_x * delta_x + delta_y * delta_y)
src_r = (paramA * dst_r * dst_r * dst_r + paramB * dst_r * dst_r + paramC * dst_r + paramD) * dst_r
factor = dst_r / src_r
src_xd = center_x + (delta_x * factor * d)
src_yd = center_y + (delta_y * factor * d)
src_x = int(src_xd)
src_y = int(src_yd)
src_y = int(src_yd)
if 0 <= src_x < image_width and 0 <= src_y < image_height:
distorted_image[y][x] = distorted_image_copy[src_y][src_x]
return distorted_image
def barrel_correction2(src_image, param_a, param_b, param_c, param_d):
xDim = get_image_height_and_width_and_channels(src_image)[0]
yDim = get_image_height_and_width_and_channels(src_image)[1]
zDim = get_image_height_and_width_and_channels(src_image)[2]
dest_image = np.zeros_like(src_image)
xcen = (xDim - 1.0) / 2.0
ycen = (yDim - 1.0) / 2.0
normDist = min(xcen, ycen)
imageMin = np.min(src_image)
dest_image.fill(imageMin)
for k in range(zDim):
for j in range(yDim):
yoff = (j - ycen) / normDist
for i in range(xDim):
xoff = (i - xcen) / normDist
rdest2 = xoff * xoff + yoff * yoff
rdest = math.sqrt(rdest2)
rdest3 = rdest2 * rdest
rdest4 = rdest2 * rdest2
rsrc = param_a * rdest4 + param_b * rdest3 + param_c * rdest2 + param_d * rdest                rsrc = normDist * rsrc
ang = math.atan2(yoff, xoff)
xSrc = xcen + (rsrc * s(ang))
ySrc = ycen + (rsrc * math.sin(ang))
if 0 <= xSrc < xDim - 1 and 0 <= ySrc < yDim - 1:
xBa = int(math.floor(xSrc))
delX = float(xSrc - xBa)
yBa = int(math.floor(ySrc))
delY = float(ySrc - yBa)
dest_image[j][i][k] = int((1 - delX) * (1 - delY) * src_image[yBa][xBa][k])
if xSrc < (xDim - 1):
dest_image[j][i][k] += int(delX * (1 - delY) * src_image[yBa][xBa + 1][k])
if ySrc < (yDim - 1):
社会哲学
dest_image[j][i][k] += int((1 - delX) * delY * src_image[yBa + 1][xBa][k])
if (xSrc < (xDim - 1)) and (ySrc < (yDim - 1)):
dest_image[j][i][k] += int(delX * delY * src_image[yBa + 1][xBa + 1][k])
return dest_image鸡的英语怎么读
def save_image_array(image_array, fname):
imageio.imwrite(fname, image_array)
if __name__ == "__main__":
start = time.time()
print("start " + ime())
original_image = read_image_return_nparray(
original_image = read_image_return_nparray(
"/Urs/pengyuyan/Desktop/singleFrame/images/singleImages/3.png")
# original_grey_image = read_color_image_as_gray_return_nparray(
#    "/Urs/pengyuyan/Desktop/singleFrame/images/singleImages/4.png")
新东方家庭教育h, w, z = get_image_height_and_width_and_channels(original_image)
paramA = 0.08  # affects only the outermost pixels of the image
paramB = -0.36  # most cas only require b optimization
paramC = 0.0  # most uniform correction
paramD = 1.0 - paramA - paramB - paramC  # describes the linear scaling of the image
corrected_original_image = barrel_correction2(original_image, paramA, paramB, paramC, paramD)
# colored_result = cv2.cvtColor(corrected_original_image, cv2.COLOR_GRAY2RGB)
save_image_array(corrected_original_image,
女朋友睡前故事大全"/Urs/pengyuyan/Desktop/singleFrame/images/mytest_result_images/barrel3_result_python.png")
end = time.time()
print("end " + ime())
print("duration: {}".format(end - start))
其中,paramA、paramB、paramC以及paramD需要根据⾃⼰的实际图⽚进⾏调整。这⾥给出⼀张实验图⽚及其对应的结果。
原图
结果图提升代码运⾏效率
以下是我的代码。⾸先第⼀个是获取图⽚之间对应关系的代码。

本文发布于:2023-07-09 06:03:53,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/1074018.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:畸变   效果   图像   枕型   代码   对应   边缘
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图