设为首页 加入收藏

TOP

OpenCV矩阵Mat的运算——在DIP作业(图像增强)中出现问题解决
2014-11-23 22:22:20 来源: 作者: 【 】 浏览:19
Tags:OpenCV 矩阵 Mat 运算 DIP 作业 图像 增强 出现 问题 解决

本次作业是要求不用OpenCV中的库函数,选择两张不好的图片对其进行图像增强。我选了一张过白的image,想通过指数变换的方法对其进行图像增强。作为初级学习OpenCV 运用者,由于OpenCV没怎么编过程序,所以一开始就遇到了很多问题。


--------------------------------------分割线 --------------------------------------


编辑推荐


--------------------------------------分割线 --------------------------------------


1 Mat 的数据类型导致运算的错误


下面是主程序:


#include
#include
#include
#include
using namespace std;
using namespace cv;
#define POWER_a 3.0 //幂指数变换的指数大小
void PowerTransfor(Mat image); //利用指数变换对过白图片的处理函数
int main ()
{
const char *image_name1="E:\\Program\\DIP\\HW_1_enhance\\guobai.jpg";
Mat img; //save the image that was processed
img = imread(image_name1,CV_LOAD_IMAGE_GRAYSCALE); //只读取灰度分量
cout<<"the size of img is "< cvNamedWindow("ORIGINAL PICTURE",CV_WINDOW_AUTOSIZE);
imshow("ORIGINAL PICTURE",img);
PowerTransfor(img);
return 0;
}


下面就是指数变换函数:


/*************对过白的图片进行处理*******************/
void PowerTransfor(Mat image)
{
Mat newImage(image.size(),CV_64FC1);
double pixMax = 0.0;
double pixMin = 255.0;
for (int i = 0; i < image.rows; i++)
{
for (int j = 0; j < image.cols; j++)
{
newImage.at(i,j) = pow(image.at(i,j),POWER_a);
if (newImage.at(i,j) >= pixMax)
{
pixMax = newImage.at(i,j);


}
if (newImage.at(i,j) <= pixMin)
{
pixMin = newImage.at(i,j);
}


}
}
for (int i = 0; i < image.rows; i++)
{
for (int j = 0; j < image.cols; j++)
{
image.at(i,j) = (uchar)(newImage.at(i,j)/(pixMax - pixMin)*255); //将处理后的值归化到(0~255)中.
}


}
cvNamedWindow("PowerTransfor PICTURE",CV_WINDOW_AUTOSIZE);
imshow("PowerTransfor PICTURE",image);
cvWaitKey(0);
}


1.1 通过imread读取图像得到的矩阵img,这个矩阵的元素是uchar类型(0:255)的。所以有必要对各种类型的字节数有个了解。


1.2 需要一个保存处理后的像素的矩阵,这个矩阵需要和img的size一致,同时,数据类型又要大于uchar的类型,我们可以用float或者double类型。


定义这个同型矩阵的方法:


Mat newImage(image.size(),CV_32FC1);


或者:


Mat newImage(image.rows,image.cols,CV_32FC1);//也可以


错误的方法;


Mat newImage(image.size,CV_32FC1);//size需要括号。


Mat newImage=img.clone(); //得到的是和img同类型的,元素也是相同的,所以不行。


Mat newImage(image.size(),double);//切记,类型是opencv规定的类型,不是C++中的类型double之类的。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇MapReduce实现矩阵相乘算法 下一篇C++如何拒绝对象的copy

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: