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

2023-10-09 11:32

本文主要是介绍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);
}
}


//清理内存

这篇关于C++中把线形存储的像素转化为二维数组形式,做图像增前处理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/172558

相关文章

Python获取C++中返回的char*字段的两种思路

《Python获取C++中返回的char*字段的两种思路》有时候需要获取C++函数中返回来的不定长的char*字符串,本文小编为大家找到了两种解决问题的思路,感兴趣的小伙伴可以跟随小编一起学习一下... 有时候需要获取C++函数中返回来的不定长的char*字符串,目前我找到两种解决问题的思路,具体实现如下:

C++ Sort函数使用场景分析

《C++Sort函数使用场景分析》sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变,如果某些场景需要保持相同元素间的相对顺序,可使... 目录C++ Sort函数详解一、sort函数调用的两种方式二、sort函数使用场景三、sort函数排序

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

C/C++错误信息处理的常见方法及函数

《C/C++错误信息处理的常见方法及函数》C/C++是两种广泛使用的编程语言,特别是在系统编程、嵌入式开发以及高性能计算领域,:本文主要介绍C/C++错误信息处理的常见方法及函数,文中通过代码介绍... 目录前言1. errno 和 perror()示例:2. strerror()示例:3. perror(

C++变换迭代器使用方法小结

《C++变换迭代器使用方法小结》本文主要介绍了C++变换迭代器使用方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、源码2、代码解析代码解析:transform_iterator1. transform_iterat

详解C++中类的大小决定因数

《详解C++中类的大小决定因数》类的大小受多个因素影响,主要包括成员变量、对齐方式、继承关系、虚函数表等,下面就来介绍一下,具有一定的参考价值,感兴趣的可以了解一下... 目录1. 非静态数据成员示例:2. 数据对齐(Padding)示例:3. 虚函数(vtable 指针)示例:4. 继承普通继承虚继承5.

C++中std::distance使用方法示例

《C++中std::distance使用方法示例》std::distance是C++标准库中的一个函数,用于计算两个迭代器之间的距离,本文主要介绍了C++中std::distance使用方法示例,具... 目录语法使用方式解释示例输出:其他说明:总结std::distance&n编程bsp;是 C++ 标准

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

C#使用SQLite进行大数据量高效处理的代码示例

《C#使用SQLite进行大数据量高效处理的代码示例》在软件开发中,高效处理大数据量是一个常见且具有挑战性的任务,SQLite因其零配置、嵌入式、跨平台的特性,成为许多开发者的首选数据库,本文将深入探... 目录前言准备工作数据实体核心技术批量插入:从乌龟到猎豹的蜕变分页查询:加载百万数据异步处理:拒绝界面

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处