一、基本运算分类
- 根据数字图像处理运算中输入信息与输出信息的类型可分为:
- 单幅图像→单幅图像(基本运算)
- 多幅图像→单幅图像
- 单幅或多幅图像→数值/符号等;
第一类:基本运算
- 第一类运算是图像处理中最基本的功能;
- 根据图像运算的数学特征,图像进本运算方式可分为:
- 点运算,代数运算,几何运算,逻辑运算;
第二类:多幅图像→单幅图像
第三类:图像→数值/符号
- 指纹识别:比对特征点
基本运算按处理的范围分类
- 点运算:运算结果只依赖于输入图像对应点的灰度值;
- 局部运算:运算结果是根据输入图像中以对应像素为中心的邻域内多个像素的灰度值计算出来;
- 全局运算:对整幅图像进行相同的处理;
像素间的基本关系
- 邻域:4方向有邻居称c的4邻域。记为N4(c);8方向有邻居称c的8邻域。记为N8(c)
- 对角邻域
- 连接:像素空间上邻接且像素灰度值满足相似性准则;
4-连接:q是p的4邻域,且值满足相似性;
8-连接:q是p的8邻域,且值满足相似性;
m-连接:去除连接的歧义性; - 当像素间同时存在4和8连接时:
- 优先采用4-连接;
- 连通:像素按连接关系而形成的一条路径(4-连通,8-连通,m-连通)
- 连通分量:像素q连通到像素p的所有像素点的集合;
- 距离。便捷、区域、空洞(图论、拓扑学)
二、点运算
点运算的概念
- 点运算:即输出图像中每个像素点的灰度值仅由相对应输入像素点的灰度值确定。
- 作用:可改变像素点的灰度值。
- 点运算的实质:是灰度到灰度的映射过程。
- 点运算也称灰度变换、对比度增强、对比度拉伸;
- 分类:
点运算的运用
- 对比度增强:又称对比度拉伸;
- 光度学标定:消除图像传感器非线性影响;
- 显示标定:让感兴趣的所有特征同等突出的显示出来;
- 轮廓线:可获得图像的轮廓线。(如二值化)
- 剪裁:使图像输出灰度级裁剪到0-255;
二值化处理及实现
三、代数运算
- 指两幅输入图像之间进行点对点的加减乘除运算得到输出图像的过程
加法运算——应用一
- 去除“叠加性”噪声(高斯噪声),太空航天器传回的星际图像;
加法运算——应用二
- 生成图像叠加效果(双重曝光)
# -*- coding: utf-8 -*-
"""
Created on Thu Apr 2 09:48:06 2020
@author: 张若昀的对象
"""
from PIL import Image;
import numpy as np;
img1=Image.open(r"C:\课堂\数字图像处理\实验参考图像\实验参考图像\合成-和1.jpg")
img2=Image.open(r"C:\课堂\数字图像处理\实验参考图像\实验参考图像\合成-和2.jpg")
im_new=img1.copy()
width,height=img1.size
for i in range(width):
for j in range(height):
r1,g1,b1=img1.getpixel((i,j))
r2,g2,b2=img2.getpixel((i,j))
im_new.putpixel((i,j),(int(r1*0.3+r2*0.7),int(g1*0.3+g2*0.7),int(b1*0.3+b2*0.7)))
im_new.show()
悄悄整个美图(我觉得挺好看的嘻嘻 乡下的傍晚挺美的
减法
# -*- coding: utf-8 -*-
"""
Created on Thu Apr 2 09:48:06 2020
@author: 张若昀的对象
"""
from PIL import Image;
import numpy as np;
img1=Image.open(r"C:\课堂\数字图像处理\实验参考图像\实验参考图像\合成-差1.jpg")
img2=Image.open(r"C:\课堂\数字图像处理\实验参考图像\实验参考图像\合成-差2.jpg")
im_new=img1.copy()
width,height=img1.size
for i in range(width):
for j in range(height):
r1,g1,b1=img1.getpixel((i,j))
r2,g2,b2=img2.getpixel((i,j))
im_new.putpixel((i,j),(int(r1*2-r2),int(g1*2-g2),int(b1*2-b2)))
im_new.show()
乘法
# -*- coding: utf-8 -*-
"""
Created on Thu Apr 2 09:48:06 2020
@author: 张若昀的对象
"""
from PIL import Image;
import numpy as np;
import math;
img1=Image.open(r"C:\课堂\数字图像处理\实验参考图像\实验参考图像\合成-乘1.jpg")
img2=Image.open(r"C:\课堂\数字图像处理\实验参考图像\实验参考图像\合成-乘2.jpg")
im_new=img1.copy()
width,height=img1.size
for i in range(width):
for j in range(height):
r1,g1,b1=img1.getpixel((i,j))
r2,g2,b2=img2.getpixel((i,j))
im_new.putpixel((i,j),(int(r1*r2/255),int(g1*g2/255),int(b1*b2/255)))
im_new.show()
除法
- 应用:校正成像设备的非线性影响;消除图像数字化设备
其他运算——逻辑运算——求反
- 负向255-d 底片效果
逻辑运算——异或
- 加号带个圈,数值不同为真
几何运算
- 几何运算又称几何变换;
- 图像的集合变换是指图像处理中对图像位置变换(平移、旋转、镜像)、形状变换(放大、缩小、错切)以及图像符合变换;
- 特点:改变图像的大小、形状或空间位置
几何变换的数字表达
- 几何变换的数字表达:
- 可实现图像以坐标原点的比例缩放、旋转和错切等变换
齐次坐标表示法——扩充矩阵方法
- 其次坐标表示法:以n+1维向量表示n维向量;
- 齐次坐标的集合意义:相当于点(x,y)投影在xyz三维立体空间上。
- 规范化齐次坐标;
齐次矩阵
- [a b c d]可实现比例缩放、镜像、错切、旋转;
- [p q]平移变换;
- [l m]实现透视变换当l=0,m=0时无透视作用;
- [s]实现全比例变换;
实验二 图像集合变换
- 实验目的:掌握图像平移、放大、缩小、旋转、镜像等几何变换
平移变换的常见问题
- 需要新建图像对象吗?(需要);
- 平移后图像要不要扩大?(可以扩大,扩大之后不需要考虑下标越界)
- 平移后空下的部分如何处理?
- 映射方向选择?
向前映射与向后映射
向前映射:遍历原图像各像素点的下标,计算改点在结果图像上位置,并赋值过去。
向后映射:遍历结果图像个像素点的下标,计算该点在原始图像上的对应像素点,并赋值过来。(多用向后映射)
平移变换的算法步骤
# -*- coding: utf-8 -*-
"""
Created on Thu Apr 9 09:34:15 2020
@author: 张若昀的对象
"""
from PIL import Image;
img1=Image.open(r"C:\课堂\数字图像处理\实验参考图像\实验参考图像\lena_256.bmp")
dx,dy=-50,50
im_new=Image.new("L",img1.size,255)
width,height=im_new.size
for i in range(width):
for j in range(height):
if(i-dx>=0 and j-dy>=0 and i-dx<width and j-dy<height):
r1=img1.getpixel((i-dx,j-dy))
r2=r1
im_new.putpixel((i,j),(r2))
im_new.show()
img1.show()
# -*- coding: utf-8 -*-
"""
Created on Thu Apr 9 09:34:15 2020
@author: 张若昀的对象
"""
from PIL import Image;
img1=Image.open(r"C:\课堂\数字图像处理\实验参考图像\实验参考图像\合成-和1.jpg")
dx,dy=-50,50
im_new=Image.new("RGB",img1.size,(255,255,255))
width,height=im_new.size
for i in range(width):
for j in range(height):
if(i-dx>=0 and j-dy>=0 and i-dx<width and j-dy<height):
r1,g1,b1=img1.getpixel((i-dx,j-dy))
r2,g2,b2=r1,g1,b1
im_new.putpixel((i,j),(r2,g2,b2))
im_new.show()
img1.show()
水平镜像
**# -*- coding: utf-8 -*-
"""
Created on Thu Apr 9 09:34:15 2020
@author: 张若昀的对象
"""
from PIL import Image;
img1=Image.open(r"C:\课堂\数字图像处理\实验参考图像\实验参考图像\合成-和1.jpg")
dx,dy=-50,50
im_new=Image.new("RGB",img1.size,(255,255,255))
width,height=im_new.size
for i in range(width):
for j in range(height):
#if(i-dx>=0 and j-dy>=0 and i-dx<width and j-dy<height):
r1,g1,b1=img1.getpixel((width-i-1,j))
r2,g2,b2=r1,g1,b1
im_new.putpixel((i,j),(r2,g2,b2))
im_new.show()
img1.show()
**
缩放变换特点
- 图像缩小放大后,画布需相应缩小和放大;
- 图像缩小变换是在已知图像信息中选择需要保留的信息;
- 反之,放大变换则需要对多出来的像素点填入适当的值;
放大变换映射方向分析
- 最简单的情况:放大两倍
- 向前和向后映射哪个更好:向后
如果是向前映射,放大倍数之后,原图几个点新图也几个点,造成有空白出现;
如果是向后映射原图坐标除以倍数和原图坐标对应,所以向后映射可以取整,让每个坐标都有对应的值,不会出现空白;
放大变换的新问题
一个点无限放大后会变成马赛克;
缩放变换的算法步骤
# -*- coding: utf-8 -*-
"""
Created on Thu Apr 16 08:58:38 2020
@author: 张若昀的对象
"""
##放大
from PIL import Image;
img1=Image.open(r"C:\课堂\数字图像处理\实验参考图像\实验参考图像\合成-和1.jpg")
x,y=1.5,1.2
width,height=img1.size
im_new=Image.new("RGB",(int(width*x)+1,int(height*y)+1),(255,255,255))
for i in range(int(width*x)+1):
for j in range(int(height*y)+1):
r1,g1,b1=img1.getpixel((int(i/x),int(j/y)))
im_new.putpixel((i,j),(r1,g1,b1))
im_new.show()
img1.show()
# -*- coding: utf-8 -*-
"""
Created on Thu Apr 16 08:58:38 2020
@author: 张若昀的对象
"""
##缩小
from PIL import Image;
img1=Image.open(r"C:\课堂\数字图像处理\实验参考图像\实验参考图像\合成-和1.jpg")
x,y=0.5,0.4
width,height=img1.size
im_new=Image.new("RGB",(int(width*x)+1,int(height*y)+1),(255,255,255))
for i in range(int(width*x)+1):
for j in range(int(height*y)+1):
r1,g1,b1=img1.getpixel((int(i/x),int(j/y)))
im_new.putpixel((i,j),(r1,g1,b1))
im_new.show()
img1.show()
几何变换——旋转变换
- 图像旋转变化后位置和大小有无变化?
旋转变换——极坐标表示
- 设点P0(x0,y0)旋转斯塔角后的坐标
旋转变化可能出现的问题
- 图像出现锯齿状错位;
- 图像旋转之后出现许多空白点,要对其进行插值;
# -*- coding: utf-8 -*-
"""
Created on Thu Apr 16 09:45:08 2020
@author: 张若昀的对象
"""
import math;
from PIL import Image;
img1=Image.open(r"C:\课堂\数字图像处理\实验参考图像\实验参考图像\合成-和1.jpg")
x=math.pi*30/180;
width,height=img1.size
im_new=Image.new("RGB",img1.size,(255,255,255))
for i in range(width):
for j in range(height):
a=int(i*math.cos(x)-j*math.sin(x))
b=int(i*math.sin(x)+j*math.cos(x))
if a>=0 and a<width and b>=0 and b<height:
r1,g1,b1=img1.getpixel((a,b))
im_new.putpixel((i,j),(r1,g1,b1))
im_new.show()
img1.show()
# -*- coding: utf-8 -*-
"""
Created on Thu Apr 16 10:18:44 2020
@author: 张若昀的对象
"""
from PIL import Image;
img1=Image.open(r"C:\课堂\数字图像处理\实验参考图像\实验参考图像\合成-和1.jpg")
#垂直错切的比例
x=0.3;
width,height=img1.size
#新建图片
im_new=Image.new("RGB",(width,int(height+width*x)),(255,255,255))
for i in range(width):
for j in range(int(height+width*x)):
#向后映射的坐标变换
if j-x*i>=0 and j-x*i<height:
r1,g1,b1=img1.getpixel((i,int(j-x*i)))
im_new.putpixel((i,j),(r1,g1,b1))
im_new.show()
img1.show()
控制点变换
透视变换
复合变换
- 图像的复合变换:是指对给定的图像连续施行若干次变换;
- 复合平移变换;
- 复合缩放变换;
总结:几何变换的特点
- 空间坐标:坐标值发生变化;图像范围发生变化;
- 像素颜色值:像素值不发生变化;像素值部分发生变化;(取整)
五、灰度级插值
- 原因:图像经过放大。旋转等变换时,新图像的像素点中原图像并没有对应的像素点,需要进行灰度级插值;
最邻近插值法
- 实质:最邻近点重复;
- 优点:简单、快速;
- 缺点:误差较大、有马赛克效应;
双线性插值法
- 用线性内插方法,根据点f的相邻点的灰度值,通过两次插值计算出灰度值;
- 优点:考虑了相邻个点的特征,具有灰度平滑过渡的效果;一般情况下可获得满意效果;
- 缺点:计算量有点大;具有低通滤波性质,使高频分量减弱,所以使图像的轮廓在一定程度上受损;(模糊)
- 不连续性会产生不希望的结果(如黑白相邻);
图像处理中灰度插值方法的选择
- 考虑图像的显示要求和计算量;
- 考虑内插结果对图像分析的影响;当纹理为主要信息是,最近邻插值将严重改变图像的纹理信息;
非几何变换与几何变换
- 几何变换:空间位置改变,像素值不变;
- 非几何变换:空间位置不变,但是像素值改变;
- 非几何变换我们更习惯称为灰度变换;
高老师人也太好了吧1551太好了怎么会有这么照顾同学的老师呢