图像处理的基本运算

 说明:资料源于中科院刘定生数字图像处理课程

目录

1.像素级运算(单纯的像素值的变换,无空间位置的改变)

2.空域变换

3.灰度直方图

************************************************************************************************************************************************

1.像素级运算

点运算特点:

(1)点运算针对图像中每一个像素灰度,独立的进行灰度值的改变。

(2)输出图像中每个像素点的灰度值,仅仅取决于相应输入点的值。

(3)点运算不改变图像内的空间关系。(不考虑人眼视觉效果)

(4)从像素到像素的操作

(5)点运算可完全由灰度变化函数或灰度映射表来确定

【1】点运算

  #线性点运算{I_{out}}(x,y)=a*{I_{in}}(x,y))+b

         a=1,b=0    恒等

         |a|>1        增加对比度

         |a|<1        减小对比度

         b>0          增加整体亮度

         b<0          减小整体亮度

   #非线性点运算

   #映射表点运算(速度快,在公式法无法表达时可以选用)

输入像素值01234567
输出像素值46732015

 

         

 

【2】代数运算

    (1)加法:

  C(x,y)=A(x,y)+B(x.y)

  应用:去除叠加性噪音、生成图像叠加效果

  #有一个噪音图像集{ {g_{i}(x,y)} }  i=1,2,...M

  g_{i}(x,y)=f(x,y)+h(x,y)_{i}    

  M个图像的均值定义为:g(x,y)=(g_{0}(x,y)+g_{1}(x,y)+...+g_{M}(x,y))/M

当:h(x,y)_{i}互不相关,且均值为0时,上述方法可以降低噪音影响。

#图像叠加

A(x,y)=0.5f(x,y)+0.5h(x,y)

A(x,y)=αf(x,y)+β(x,y)  (α+β=1)

    (2)减法:

C(x,y)=A(x,y)-B(x,y)

应用:去除不需要的叠加图案、检测两幅同一场景图像的区别

#去除叠加图案 背景图像:b(x,y),前景、背景混合图像:f(x,y)

g(x,y)=f(x,y)-b(x,y)

#检测同一场景不同时刻图像的变化

g(x,y)=T_{1}(x,y)-T_{2}(x,y)

  (3)乘法

图像的局部显示

C(x,y)=A(x,y)xB(x,y)

A(x,y):原图像  B(x,y):二值蒙板图像

【3】逻辑运算(与、或、求反、异或)针对二值图像

(1)求反:

g(x,y)=R-f(x,y)      R:为f(x,y)的灰度级,如255(对8bit来说)

应用:获得一个图像的负像、获取子图像的补像

2.空域变换

几何变换(改变图像形状、大小、位置):基本变换、灰度插值

非几何变换(改变图像像素值):模板运算、灰度变换、直方图变换(点运算也属于非几何变换的一种)

【1】几何变换:(与计算机图形学密切相关)

类型:二维平面图像的几何变换、三维图像向二维的投影变换等

注:转到按冈萨雷斯的数字图像处理第三版,所以暂时到这里

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

                           

 

 

 

好资源#include #include #include using namespace std; //表结点 typedef struct ArcNode{ int adjvex;//该弧所指向的顶点的位置 ArcNode *nextarc;//指向下一条弧的指针 }ArcNode; //头结点 typedef struct VNode{ string data;//顶点信息 ArcNode* firstarc;//第一个表结点的地址,指向第一条依附该顶点的弧的指针 }VNode, AdjList[10]; typedef struct{ AdjList vertices; int vexnum, arcnum;//图的顶点数和弧数 }ALGraph; int LocateVex(ALGraph G, string u)//返回顶点u在图中的位置 { for(int i=0; i<G.vexnum; i++) if(G.vertices[i].data==u) return i; return -1; } void CreateUDG(ALGraph &G)//构造无向图 { string v1, v2; int i, j, k; cout<>G.vexnum>>G.arcnum; cout<<"请输入顶点:"; for(i=0; i>G.vertices[i].data; G.vertices[i].firstarc=NULL; } cout<<"请输入边:"; cout<<endl; for(k=0; k>v1>>v2; i=LocateVex(G, v1); j=LocateVex(G, v2); //插入v1的邻接表,为了提高效率,总在表头插入结点。 ArcNode *arc=new ArcNode; arc->adjvex=j; arc->nextarc=G.vertices[i].firstarc; G.vertices[i].firstarc=arc; //插入v2的邻接表,为了提高效率,总在表头插入结点。 arc=new ArcNode; arc->adjvex=i; arc->nextarc=G.vertices[j].firstarc; G.vertices[j].firstarc=arc; } } void Print(ALGraph G)//打印邻接表 { cout<<"打印邻接表如下:"; cout<<endl; for(int i=0; i<G.vexnum; i++)//遍历每个顶点的邻接表 { cout<<G.vertices[i].data; ArcNode *p=G.vertices[i].firstarc; while(p) { cout<"<adjvex].data; p=p->nextarc; } cout<adjvex; else return -1; } int NextAdjVex(ALGraph G, int v, int w)//返回顶点v的相对于w的下一个邻接点序号 { ArcNode* p=G.vertices[v].firstarc; while(p) { if(p->adjvex==w) break; p=p->nextarc; } if(p->adjvex!=w || !p->nextarc)//如果没找到w或者w是最后一个邻接点 return -1; return p->nextarc->adjvex; } bool visited[10]; void DFS(ALGraph G, int v) { visited[v]=true; cout<<G.vertices[v].data<=0; w=NextAdjVex(G, v, w) ) if(!visited[w]) DFS(G, w); } void DFSTraverse(ALGraph G)//深搜 { for(int i=0; i<G.vexnum; i++) visited[i]=false; for(i=0; i<G.vexnum; i++) if(!visited[i]) DFS(G, i); } void BFSTraverse(ALGraph G)//广搜 { queue q; for(int i=0; i<G.vexnum; i++) visited[i]=false; for(i=0; i<G.vexnum; i++) { if(!visited[i]) { q.push(i); visited[i]=true; while(!q.empty()) { int v=q.front(); q.pop(); cout<<G.vertices[v].data<=0; w=NextAdjVex(G, v, w)) { if (!visited[w]) { q.push(w); visited[w]=true; } } } } } } void main() { ALGraph G; CreateUDG(G); Print(G); cout<<"深搜:"; DFSTraverse(G); cout<<endl; cout<<"广搜:"; BFSTraverse(G); cout<<endl; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值