您的位置:首页 > 其它

数字图像处理之几何运算

2013-12-23 22:20 459 查看
对图像进行操作,不外乎有点运算,代数运算和空间运算等。

点运算对单幅图像做处理,不改变像素的空间位置。

代数运算对多幅图像做处理,不改变像素的空间位置。

空间运算对单幅图像做处理,但是改变像素的空间位置。

这里我们要讲的是空间运算,常见的空间运算包括平移,缩放,旋转等等。

常见的几何运算的算法有2个:空间变换算法和灰度级插值算法。

灰度级插值:

1)向前映射法:

通过输入图像像素位置,
计算输出图像对应像素位置,

将该位置像素的灰度值按某种方式分配到输出图像相邻四个像素。



2)向后映射法:

通过输出图像像素位置,
计算输入图像对应像素位置,

根据输入图像相邻四个像素的灰度值计算该位置像素的灰度值。



在实际应用中,由于向前映射法需要多次运算才能得到输出图像,所以使用得不如向后映射法常见。

在这儿我主要讲向后映射法相关的内容:

1)最近邻插值法

对于一个像素点做空间运算时,其输出的灰度或像素值等于其最近的像素点的灰度或像素值。



对于编程来说,对于输出图像点(Xo,Yo)得到做几何运算之后的点(Xi,Yi),那么在原图像中对应的像素点就为(round(Xi),round(Yi))。

以下是用Python写的最近邻缩放,lvl表示缩放等级也就是缩放的百分比。

#最近邻缩放
def singleZoom(lvl):
h,w = originalImage.size
opix = originalImage.load()
nh = int(round(h * lvl , 0))
nw = int(round(w * lvl , 0))
singleImage = Image.new('RGB' , (nh,nw))
npix = singleImage.load()
for i in range (nh):
for j in range (nw):
npix[i,j] = (255,255,255)
for i in range (nh):
for j in range (nw):
x = int(round(i / lvl , 0))
y = int(round(j / lvl , 0))
if (x >= h):
x = h - 1
if (y >= w):
y = w - 1
npix[i,j] = opix[x,y]


2)双线性插值法:

由运算后的点(Xi,Yi)相邻的四个点围城一个正方形,这四个点分别有其对应的灰度值或像素值等,从而确定这个点(Xi,Yi)的灰度值或像素值。

将问题转换一下叙述就是:

单位正方形顶点值已知,求正方形内任一点的f(x,y)值。

求解方法如下:



所以就得到了结果,可以根据这个公式来求解像素点的灰度值或像素值。

以下是用Python写的双线性插值缩放,lvl表示缩放等级也就是缩放的百分比。

#双线性缩放
def doubleZoom(lvl):
h,w = originalImage.size
opix = originalImage.load()
nh = int(round(h * lvl , 0))
nw = int(round(w * lvl , 0))
singleImage = Image.new('RGB' , (nh,nw))
npix = singleImage.load()
for i in range (nh):
for j in range (nw):
npix[i,j] = (255,255,255)
for i in range (nh):
for j in range (nw):
xx = i / lvl;
yy = j / lvl;
x = int(i / lvl)
y = int(j / lvl)
xx = xx - x
yy = yy - y
if (0 <= x and x < h - 1 and 0 <= y and y < w - 1):
f00r = opix[x,y][0]
f00g = opix[x,y][1]
f00b = opix[x,y][2]
f01r = opix[x,y + 1][0]
f01g = opix[x,y + 1][1]
f01b = opix[x,y + 1][2]
f10r = opix[x + 1,y][0]
f10g = opix[x + 1,y][1]
f10b = opix[x + 1,y][2]
f11r = opix[x + 1,y + 1][0]
f11g = opix[x + 1,y + 1][1]
f11b = opix[x + 1,y + 1][2]
r = xx * (f10r - f00r) + yy * (f01r - f00r) + (f11r + f00r - f10r - f01r) * xx * yy + f00r
g = xx * (f10g - f00g) + yy * (f01g - f00g) + (f11g + f00g - f10g - f01g) * xx * yy + f00g
b = xx * (f10b - f00b) + yy * (f01b - f00b) + (f11b + f00b - f10b - f01b) * xx * yy + f00b
r = int(round(r , 0))
g = int(round(g , 0))
b = int(round(b , 0))
npix[i,j] = (r,g,b)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: