VC++图像处理矩阵数组赋值问题
我做的VC++图像处理,用一个一维数组表示二维矩阵,对图像处理经常会对矩阵的某一行、某一列、某几行、某几列进行修改或者复制,这个修改或者赋值函数只能通过直接调用对应的数组来直接赋值,但是运算时间特别长,希望能给些建议 跪谢!!!!
我把我的矩阵给大家看看,函数也给大家看看,图像处理,对矩阵的某一行、某一列、某几行、某几列进行修改或者复制也给出来了,大家帮帮忙吧
class CMatrix
{
public:
int m_nNumColumns; // 矩阵列数
int m_nNumRows; // 矩阵行数
double* m_pData; // 矩阵数据缓冲区
};
//////////////////////////////////////////////////////////////////////
// 设置指定元素的值
//
// 参数:
// 1. int nRows - 指定的矩阵行数
// 2. int nCols - 指定的矩阵列数
// 3. double value - 指定元素的值
//
// 返回值:BOOL 型,说明设置是否成功
//////////////////////////////////////////////////////////////////////
BOOL CMatrix::SetElement(int nRow, int nCol, double value)
{
if (nCol < 0 || nCol >= m_nNumColumns || nRow < 0 || nRow >= m_nNumRows)
return FALSE;// array bounds error
if (m_pData == NULL)
return FALSE;// bad pointer error
m_pData[nCol + nRow * m_nNumColumns] = value;
return TRUE;
}
//////////////////////////////////////////////////////////////////////
// 设置指定元素的值
//
// 参数:
// 1. int nRows - 指定的矩阵行数
// 2. int nCols - 指定的矩阵列数
//
// 返回值:double 型,指定元素的值
//////////////////////////////////////////////////////////////////////
double CMatrix::GetElement(int nRow, int nCol) const
{
ASSERT(nCol >= 0 && nCol < m_nNumColumns && nRow >= 0 && nRow < m_nNumRows); // array bounds error
ASSERT(m_pData);// bad pointer error
return m_pData[nCol + nRow * m_nNumColumns];
}
//////////////////////////////////////////////////////////////////////
//对A矩阵的第h行赋值为m矩阵的第k行
//fuhangzhi(CMatrix A,int h, CMatrix m, int k)
//(Matlab) A=m(k,:)
//(VC++) 把m矩阵的k-1行赋值给A矩阵的h-1行
// 内部要求:A矩阵和m矩阵必须列数一样
// 外部要求:必须针对Matlab矩阵的行列数(内部调整为VC++行列数)
//////////////////////////////////////////////////////////////////////
CMatrix CMatrix::fuhangzhi(CMatrix A,int h,CMatrix m,int k)
{
k--;//区分matlab和vc++矩阵关系
h--;
for(int i=0;i<A.GetNumColumns();i++)
// A.m_pData[i + h*A.GetNumColumns()] =m.GetElement(k,i);
return A;
}
//////////////////////////////////////////////////////////////////////
//对A矩阵的第h列赋值为m矩阵的第k列
//fuliezhi(CMatrix A,int h, CMatrix m, int k)
//(Matlab) A=m(:,k)
//(VC++) 把m矩阵的k-1列赋值给A矩阵的h-1行
// 内部要求:A矩阵和m矩阵必须行数一样
// 外部要求:必须针对Matlab矩阵的行列数(内部调整为VC++行列数)
//////////////////////////////////////////////////////////////////////
CMatrix CMatrix::fuliezhi(CMatrix A,int h,CMatrix m,int k)
{
//区分matlab和vc++矩阵关系
h--;
k--;
for(int i=0;i<A.GetNumRows();i++)
A.SetElement(i,h,m.GetElement(i,k));
return A;
}
//////////////////////////////////////////////////////////////////////
//对C矩阵的每一行,分别按照B矩阵从上到下、从左到右的顺序,
//取数值,得到A矩阵该数值的行赋值
//C.fuduohangzhi(CMatrix A, CMatrix B)
//(Matlab) C=A(B,); (A=this)
//(VC++) 把m矩阵的k-1行赋值给A矩阵的h-1行
// 内部要求:(1) B矩阵的每个值必须小于A的列数
// (2) 必须针对Matlab矩阵的行列数(内部调整为VC++行列数)
//////////////////////////////////////////////////////////////////////
CMatrix CMatrix::fuduohangzhi(CMatrix C,CMatrix A, CMatrix B)
{
//找到要求赋值的行号
int m;
int n,i,j;
//总行数
int sum= (B.GetNumRows())*(B.GetNumColumns());
for(n=0;n<sum;n++)
{
// j=n/(B.GetNumRows());
//i=n%(B.GetNumRows());
m=(int)B.GetElement(n,0);
C=fuhangzhi(C,n+1,A,m);
}
return C;
}
//////////////////////////////////////////////////////////////////////
//对C矩阵的每一列,分别按照B矩阵从上到下、从左到右的顺序,
//取数值,得到A矩阵该数值的列赋值
//A.fuduohangzhi(CMatrix A, CMatrix B)
//(Matlab) C=A(B,); (A=this)
//(VC++) 把m矩阵的k-1行赋值给A矩阵的h-1行
// 内部要求:(1) B矩阵的每个值必须小于A的列数
// (2) 必须针对Matlab矩阵的行列数(内部调整为VC++行列数)
//////////////////////////////////////////////////////////////////////
CMatrix CMatrix::fuduoliezhi(CMatrix C,CMatrix A, CMatrix B)
{
//找到要求赋值的行号
int m;
int n,i,j;
//总行数
int sum= (B.GetNumRows())*(B.GetNumColumns());
for(n=0;n<sum;n++)
{
j=n/(B.GetNumRows());
i=n%(B.GetNumRows());
m=(int)B.GetElement(i,j);
C=fuliezhi(C,n+1,A,m);
}
return C;
}
我把我的矩阵给大家看看,函数也给大家看看,图像处理,对矩阵的某一行、某一列、某几行、某几列进行修改或者复制也给出来了,大家帮帮忙吧
class CMatrix
{
public:
int m_nNumColumns; // 矩阵列数
int m_nNumRows; // 矩阵行数
double* m_pData; // 矩阵数据缓冲区
};
//////////////////////////////////////////////////////////////////////
// 设置指定元素的值
//
// 参数:
// 1. int nRows - 指定的矩阵行数
// 2. int nCols - 指定的矩阵列数
// 3. double value - 指定元素的值
//
// 返回值:BOOL 型,说明设置是否成功
//////////////////////////////////////////////////////////////////////
BOOL CMatrix::SetElement(int nRow, int nCol, double value)
{
if (nCol < 0 || nCol >= m_nNumColumns || nRow < 0 || nRow >= m_nNumRows)
return FALSE;// array bounds error
if (m_pData == NULL)
return FALSE;// bad pointer error
m_pData[nCol + nRow * m_nNumColumns] = value;
return TRUE;
}
//////////////////////////////////////////////////////////////////////
// 设置指定元素的值
//
// 参数:
// 1. int nRows - 指定的矩阵行数
// 2. int nCols - 指定的矩阵列数
//
// 返回值:double 型,指定元素的值
//////////////////////////////////////////////////////////////////////
double CMatrix::GetElement(int nRow, int nCol) const
{
ASSERT(nCol >= 0 && nCol < m_nNumColumns && nRow >= 0 && nRow < m_nNumRows); // array bounds error
ASSERT(m_pData);// bad pointer error
return m_pData[nCol + nRow * m_nNumColumns];
}
//////////////////////////////////////////////////////////////////////
//对A矩阵的第h行赋值为m矩阵的第k行
//fuhangzhi(CMatrix A,int h, CMatrix m, int k)
//(Matlab) A=m(k,:)
//(VC++) 把m矩阵的k-1行赋值给A矩阵的h-1行
// 内部要求:A矩阵和m矩阵必须列数一样
// 外部要求:必须针对Matlab矩阵的行列数(内部调整为VC++行列数)
//////////////////////////////////////////////////////////////////////
CMatrix CMatrix::fuhangzhi(CMatrix A,int h,CMatrix m,int k)
{
k--;//区分matlab和vc++矩阵关系
h--;
for(int i=0;i<A.GetNumColumns();i++)
// A.m_pData[i + h*A.GetNumColumns()] =m.GetElement(k,i);
return A;
}
//////////////////////////////////////////////////////////////////////
//对A矩阵的第h列赋值为m矩阵的第k列
//fuliezhi(CMatrix A,int h, CMatrix m, int k)
//(Matlab) A=m(:,k)
//(VC++) 把m矩阵的k-1列赋值给A矩阵的h-1行
// 内部要求:A矩阵和m矩阵必须行数一样
// 外部要求:必须针对Matlab矩阵的行列数(内部调整为VC++行列数)
//////////////////////////////////////////////////////////////////////
CMatrix CMatrix::fuliezhi(CMatrix A,int h,CMatrix m,int k)
{
//区分matlab和vc++矩阵关系
h--;
k--;
for(int i=0;i<A.GetNumRows();i++)
A.SetElement(i,h,m.GetElement(i,k));
return A;
}
//////////////////////////////////////////////////////////////////////
//对C矩阵的每一行,分别按照B矩阵从上到下、从左到右的顺序,
//取数值,得到A矩阵该数值的行赋值
//C.fuduohangzhi(CMatrix A, CMatrix B)
//(Matlab) C=A(B,); (A=this)
//(VC++) 把m矩阵的k-1行赋值给A矩阵的h-1行
// 内部要求:(1) B矩阵的每个值必须小于A的列数
// (2) 必须针对Matlab矩阵的行列数(内部调整为VC++行列数)
//////////////////////////////////////////////////////////////////////
CMatrix CMatrix::fuduohangzhi(CMatrix C,CMatrix A, CMatrix B)
{
//找到要求赋值的行号
int m;
int n,i,j;
//总行数
int sum= (B.GetNumRows())*(B.GetNumColumns());
for(n=0;n<sum;n++)
{
// j=n/(B.GetNumRows());
//i=n%(B.GetNumRows());
m=(int)B.GetElement(n,0);
C=fuhangzhi(C,n+1,A,m);
}
return C;
}
//////////////////////////////////////////////////////////////////////
//对C矩阵的每一列,分别按照B矩阵从上到下、从左到右的顺序,
//取数值,得到A矩阵该数值的列赋值
//A.fuduohangzhi(CMatrix A, CMatrix B)
//(Matlab) C=A(B,); (A=this)
//(VC++) 把m矩阵的k-1行赋值给A矩阵的h-1行
// 内部要求:(1) B矩阵的每个值必须小于A的列数
// (2) 必须针对Matlab矩阵的行列数(内部调整为VC++行列数)
//////////////////////////////////////////////////////////////////////
CMatrix CMatrix::fuduoliezhi(CMatrix C,CMatrix A, CMatrix B)
{
//找到要求赋值的行号
int m;
int n,i,j;
//总行数
int sum= (B.GetNumRows())*(B.GetNumColumns());
for(n=0;n<sum;n++)
{
j=n/(B.GetNumRows());
i=n%(B.GetNumRows());
m=(int)B.GetElement(i,j);
C=fuliezhi(C,n+1,A,m);
}
return C;
}
...全文
相关推荐
VC++ 矩阵输入、输出运算及技术文档
VC++ 矩阵输入、输出运算及技术文档 VC++ 矩阵输入、输出运算及技术文档
C++轻量图像处理CImg库:原理、实战与避坑指南
图像处理是计算机视觉的核心环节,色彩空间转换与形态学操作是其中高频使用的技术。在C++生态中,OpenCV功能全面但依赖重、部署复杂,而单头文件的CImg库以零配置、模板化设计为轻量开发提供了另一条高效路径。它通过泛型编程统一支持灰度、彩色及多通道图像操作,膨胀、腐蚀等形态学算法调用简洁直观,适合快速验证算法与原型迭代。从工程实践看,CImg尤其适用于算法实验、教学演示及嵌入式交叉编译场景,相比OpenCV在启动速度和依赖管理上优势明显。本文结合饱和度调整、形态学滤波等具体案例,系统梳理了CImg在Wind
VC++&opencv实现的灰度共生矩阵
用visual studio 2008和opencv2.0的库实现的灰度共生矩阵,并简单计算了纹理的能量特征。自己编写并测试过,只要opencv2.0的库没问题就OK。4个方向,灰度级可调,距离可调。
VC++矩阵运算
基于MFC的matrix运算,很详细,可以解决维数不是很庞大的矩阵运算问题。
VC++图像处理教程
轻松学习VC++图像处理,轻松学习,快乐生活!!!


图形处理/算法
