数字图像处理之几何运算
2013-12-23 22:20
459 查看
对图像进行操作,不外乎有点运算,代数运算和空间运算等。
点运算对单幅图像做处理,不改变像素的空间位置。
代数运算对多幅图像做处理,不改变像素的空间位置。
空间运算对单幅图像做处理,但是改变像素的空间位置。
这里我们要讲的是空间运算,常见的空间运算包括平移,缩放,旋转等等。
常见的几何运算的算法有2个:空间变换算法和灰度级插值算法。
通过输入图像像素位置,
计算输出图像对应像素位置,
将该位置像素的灰度值按某种方式分配到输出图像相邻四个像素。
2)向后映射法:
通过输出图像像素位置,
计算输入图像对应像素位置,
根据输入图像相邻四个像素的灰度值计算该位置像素的灰度值。
在实际应用中,由于向前映射法需要多次运算才能得到输出图像,所以使用得不如向后映射法常见。
在这儿我主要讲向后映射法相关的内容:
1)最近邻插值法
对于一个像素点做空间运算时,其输出的灰度或像素值等于其最近的像素点的灰度或像素值。
对于编程来说,对于输出图像点(Xo,Yo)得到做几何运算之后的点(Xi,Yi),那么在原图像中对应的像素点就为(round(Xi),round(Yi))。
以下是用Python写的最近邻缩放,lvl表示缩放等级也就是缩放的百分比。
2)双线性插值法:
由运算后的点(Xi,Yi)相邻的四个点围城一个正方形,这四个点分别有其对应的灰度值或像素值等,从而确定这个点(Xi,Yi)的灰度值或像素值。
将问题转换一下叙述就是:
单位正方形顶点值已知,求正方形内任一点的f(x,y)值。
求解方法如下:
所以就得到了结果,可以根据这个公式来求解像素点的灰度值或像素值。
以下是用Python写的双线性插值缩放,lvl表示缩放等级也就是缩放的百分比。
点运算对单幅图像做处理,不改变像素的空间位置。
代数运算对多幅图像做处理,不改变像素的空间位置。
空间运算对单幅图像做处理,但是改变像素的空间位置。
这里我们要讲的是空间运算,常见的空间运算包括平移,缩放,旋转等等。
常见的几何运算的算法有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)
相关文章推荐
- 数字图像处理:第六章 几何运算
- 【数字图像处理】六.MFC空间几何变换之图像平移、镜像、旋转、缩放详解
- 【数字图像处理】图像二值化,腐蚀膨胀,开闭运算,击中击不中变换
- 图像处理几何运算2--栅条,中间扩展显示图像
- 【数字图像处理】五.MFC图像点运算之灰度线性变化、灰度非线性变化、阈值化和均衡化处理详解
- 数字图像处理:第八章 形态学运算
- OpenCV数字图像处理二:代数运算
- 数字图像处理:10.形态学运算
- 【数字图像处理一】RGB模型转化为HSI模型的几何方法推导
- 【数字图像处理】六.MFC空间几何变换之图像平移、镜像、旋转、缩放具体解释
- 数字图像处理-空间域增强(三)(图像的算数与逻辑运算)
- C#数字图像处理算法学习笔记(二)--点运算与直方图
- Win8Metro(C#)数字图像处理--2.23二值图像开运算
- 数字图像处理3---图像基本运算
- Win8Metro(C#)数字图像处理--2.24二值图像闭运算
- (数字图像处理)腐蚀/膨胀/开运算/闭运算
- 数字图像处理:第四章 点运算
- (5)Air Band数字图像处理基础-图像的点运算
- 数字图像处理3---图像基本运算--续
- 【python】数字图像处理:高级形态学处理 阈值分割+闭运算+连通区域标记+删除小区块+分色显示