C++中把线形存储的像素转化为二维数组形式,做图像增前处理

#include "StdAfx.h"=========数字图像处理原理与实践;基于VC++开发源代码===第九章
#include "improve.h"
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;


#pragma warning ( disable : 4018)


int GetAsh(BYTE** imageBuf, int x, int y)
{
int clr;
clr = (imageBuf[y][x*4] + imageBuf[y][x*4+1]
+imageBuf[y][x*4+2]) / 3;
return clr;
}


/********************************************************
* 把线形存储的像素转化为二维数组形式
* 参数: image 线形存储的像素, width,height 图象的长宽
********************************************************/
BYTE** CreatImage(BYTE* image, unsigned int width, unsigned int height, int bt=4)
{
BYTE** imageBuf = (BYTE**)malloc(sizeof(BYTE*)*(height));
for(int y=0; y<height; y++)
{
//使imageBuf中每个指针分别指向其下标表示的行的行首地址
imageBuf[y] = image+y*width*bt; 
}
return imageBuf;
}


/**************************************************
* 功能: 设定指定位置的像素灰度
* 参数: imageBuf为目标图像 x,y为要设定像素的坐标
**************************************************/
void SetPixelXY(BYTE** imageBuf1, int x, int y, int a)
{
imageBuf1[y][x*4] = a;
imageBuf1[y][x*4+1] = a;
imageBuf1[y][x*4+2] = a;
imageBuf1[y][x*4+3]= 255;
}


/**************************************************
* 功能: 使用模板对彩色图邻域进行运算
* 参数: imageBuf为目标图像 w、h为图像大小
*       templt为模板 tw为邻域大小 
* x,y为要取得像素的坐标
*       cn为颜色分量编号 0为蓝色 1为绿色 2为红色
**************************************************/
int TempltExcuteCl(BYTE** imageBuf0, int w, int h, int* templt, int tw, int x, int y, int cn)
{
int i,j;                        //循环变量
int m=0;                      //用来存放加权和
int px,py;   
//依次对邻域中每个像素进行运算
for(i=0; i<tw; i++)
{
for(j=0; j<tw; j++)
{
//计算对应模板上位置的像素在原图像中的位置
py=y-tw/2+i;
px=x-tw/2+j;
//加权求和
m+=imageBuf0[py][px*4+cn] * templt[i*tw+j];
}
}
return m;                     //返回结果
}


/*****************************************************************
* 功能: 使用模板对灰度图邻域进行运算 
* 参数: imageBuf为目标图像 w、h为图像大小
*       templt为模板 tw为邻域大小 
* x,y为要取得像素的坐标
******************************************************************/
int TempltExcuteAsh(BYTE** imageBuf0, int w, int h, 
int* templt, int tw, int x, int y)
{
int i,j;                        //循环变量
int m=0;                      //用来存放加权和
int px,py;   
//依次对邻域中每个像素进行运算
for(i=0; i<tw; i++)
{
for(j=0; j<tw; j++)
{
//计算对应模板上位置的像素在原图像中的位置
py=y-tw/2+i;
px=x-tw/2+j;
//加权求和
m+=GetAsh(imageBuf0,px,py) * templt[i*tw+j];
}
}
return m;                     //返回结果
}


/******************************************************************
* 功能: 灰度图像的简单平滑处理
* 参数: image0为原图形,image1为平滑结果,
* w、h为图象的宽和高
*       size为进行平滑的邻域边长
******************************************************************/
void SmoothAsh(BYTE* image0, BYTE* image1, 
  unsigned int w, unsigned int h, unsigned int size)
{
//将图像转化为矩阵形式
BYTE** imageBuf0 = CreatImage(image0, w, h);
BYTE** imageBuf1 = CreatImage(image1, w, h);
//定义模板
int* templt;
int x,y;
int a;
int scale;


//根据邻域大小设定模板
templt = new int[size * size];
for(x=0; x<size*size; x++)
{
templt[x]=1;
}
//设定衰减因子
scale = size*size;


//依次对原图像的每个像素进行处理
for(y=size/2; y<h-size/2; y++)
{
for(x=size/2; x<w-size/2; x++)
{
a=TempltExcuteAsh(imageBuf0,w,h,templt,size,x,y);
a/= scale;
//过限处理
a = a>255?255:a;    
a = a<0?0:a;
SetPixelXY(imageBuf1,x,y,a);
}
}


//清理内存
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值