opencv矩阵Mat的运算——在DIP作业(图像增强)中出现的问题
来源:互联网 发布:淘宝上电吉他哪家好 编辑:程序博客网 时间:2024/04/29 16:31
本次作业是要求不用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_a3.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 processedimg = 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之类的。
0 0
- opencv矩阵Mat的运算——在DIP作业(图像增强)中出现的问题
- 图像识别与处理之Opencv——Mat表达式的运算(矩阵的一些运算)
- Opencv Mat 矩阵的运算
- 在MFC中显示OpenCV的Mat图像矩阵 ShowMatImgToWnd(GetDlgItem(IDC_ShowImg) , matFrame);
- OpenCV图像矩阵Mat的基本操作
- OpenCV——Mat矩阵运算
- 关于MFC中显示OpenCV Mat矩阵中的图像(一种新的解决方法)
- 关于在console中查看opencv Mat 矩阵元素的问题
- 在MFC中如何显示OpenCV的图像Mat
- 一个在opencv中增强图像对比度的小程序
- opencv图像遍历中出现的问题
- OpenCV之Mat矩阵和数组的运算
- Opencv中Mat矩阵相乘——点乘、dot、mul运算详解
- OpenCV中Mat矩阵相乘——点乘、dot、mul运算详解
- Opencv中Mat矩阵乘法——点乘、dot、mul运算详解
- Qt中用QLabel显示OpenCV中Mat图像数据出现扭曲现象的解决
- OpenCv:Mat矩阵的初始化
- OpenCv矩阵(Mat)的构造
- POJ3630 Phone List
- hadoop 机架感知技术
- Axure学习笔记02.类似QQ登录窗口设计
- mysql忘记密码怎么办?
- 第四章 图的表示
- opencv矩阵Mat的运算——在DIP作业(图像增强)中出现的问题
- android字符串复制到剪贴板
- sql简单优化之in字句
- 爱泥爱你:使用软陶泥制作的新人一对
- 给年轻程序员的建议
- hdu 1196
- LayoutInflater与findViewById()
- POJ 2229 Sumsets DP
- Java 计算器的实现(两种不同思路)