ITKeyword,专注技术干货聚合推荐

注册 | 登录

opencv矩阵Mat的运算——在DIP作业(图像增强)中出现的问题

u013243710 分享于 2014-04-03

2020腾讯云“6.18”活动开始了!!!(巨大优惠重现!4核8G,5M带宽 1999元/3年),
地址https://cloud.tencent.com/act/cps/redirect?redirect=1059

2020阿里云最低价产品入口,含代金券(新老用户有优惠),
地址https://www.aliyun.com/minisite/goods

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

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

下面是主程序:

#include <iostream>
#include <highgui.h>
#include <cv.h>
#include <math.h>
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 "<<img.rows<<"X"<<img.cols<<"   "<<"channels is "<<img.channels()<<endl;  //检验是1通道的
	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<double>(i,j) = pow(image.at<uchar>(i,j),POWER_a);
			if (newImage.at<double>(i,j) >= pixMax)
			{
				pixMax = newImage.at<double>(i,j);

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

		}
	}
	for (int i = 0; i < image.rows; i++)
	{
		for (int j = 0; j < image.cols; j++)
		{
			image.at<uchar>(i,j) = (uchar)(newImage.at<double>(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之类的。




本次作业是要求不用opencv中的库函数,选择两张不好的图片对其进行图像增强。我选了一张过白的image,想通过指数变换的方法对其进行图像增强。作为初级学习opencv 运用者,由于opencv没怎么编过

相关阅读排行


相关内容推荐

最新文章

×

×

请激活账号

为了能正常使用评论、编辑功能及以后陆续为用户提供的其他产品,请激活账号。

您的注册邮箱: 修改

重新发送激活邮件 进入我的邮箱

如果您没有收到激活邮件,请注意检查垃圾箱。