【OpenCV图像处理】IplImage转换灰度图像及Cvmat与IplImage格式之间的相互转换

#define ImgPath "D:\\...\\*.JPG"

//读取图像
IplImage* Img = cvLoadImage(ImgPath);
if (!Img)
{
	fprintf(stderr, "Can not load image %s\n", ImgPath);
}

//转换为灰度图像
IplImage* ImgGray = cvCreateImage(cvGetSize(Img), IPL_DEPTH_8U, 1);
cvCvtColor(Img, ImgGray, CV_BGR2GRAY);//cvCvtColor(src,des,CV_BGR2GRAY)
cvSaveImage(ImgGrayPath, ImgGray);//保存灰度图像

//转换为矩阵
CvMat* ImgMat = cvCreateMat(ImgGray->height, ImgGray->width, CV_64FC1);//定义一个指向CvMat对象的指针
ImgMat = cvCreateMatHeader(ImgGray->height, ImgGray->width, CV_64FC1);//创建矩阵头,和图像头,数据共享(必要)
cvGetMat(ImgGray, ImgMat);//从img到mat

//二次转换为图像
IplImage* ReImg = cvCreateImage(cvGetSize(ImgMat), IPL_DEPTH_8U, 1);
cvGetImage(ImgMat, ReImg);//从mat到img

//显示调试
cvNamedWindow("image", CV_WINDOW_AUTOSIZE);//创建显示目标的窗口
cvShowImage("image", ReImg);//显示灰度图像
cvWaitKey(0);

//释放内存,关闭窗口
cvReleaseMat(&ImgMat);

cvReleaseImage(&Img);
cvReleaseImage(&ImgGray);
cvReleaseImage(&ReImg);

cvDestroyAllWindows();
在C语言中使用OpenCV库为灰度图像添加噪音可以通过在图像的每个像素上添加一个随机值来实现。这可以通过循环遍历图像的每个像素,并使用随机数生成函数来实现。以下是使用C语言和OpenCV库为灰度图像添加高斯噪音的一个基本示例: ```c #include <opencv2/opencv.hpp> #include <stdlib.h> #include <stdio.h> int main(int argc, char** argv) { // 确保输入了图像文件名 if (argc != 2) { printf("Usage: %s <Image_Path>\n", argv[0]); return -1; } // 读取灰度图像 IplImage* img = cvLoadImage(argv[1], CV_LOAD_IMAGE_GRAYSCALE); if (!img) { printf("Error: Couldn't load image\n"); return -1; } // 获取图像尺寸 int height = img->height; int width = img->width; int channels = img->nChannels; // 创建一个与原图同样大小的图像用于存放添加噪音后的图像 IplImage* img_noisy = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, channels); // 添加高斯噪音 for (int y = 0; y < height; ++y) { for (int x = 0; x < width; ++x) { // 生成0均值,variance方差的高斯噪音 double randomValue = (double)rand() / (double)(RAND_MAX) * 255; // 添加噪音到每个像素值上 img_noisy->imageData[y * img_noisy->widthStep + x] = CLAMP(img->imageData[y * img->widthStep + x] + randomValue, 0, 255); } } // 显示原图和添加噪音后的图像 cvNamedWindow("Original Image", CV_WINDOW_AUTOSIZE); cvShowImage("Original Image", img); cvNamedWindow("Noisy Image", CV_WINDOW_AUTOSIZE); cvShowImage("Noisy Image", img_noisy); // 等待按键后关闭窗口 cvWaitKey(0); // 释放图像和销毁窗口 cvReleaseImage(&img); cvReleaseImage(&img_noisy); cvDestroyWindow("Original Image"); cvDestroyWindow("Noisy Image"); return 0; } ``` 在上述代码中,`rand()`函数用于生成随机值,`CLAMP`宏用于确保像素值在0到255之间。这里我们只添加了正方向的高斯噪音,为了制造更真实的噪音,可以同时添加正负方向的噪音。请注意,在实际使用中,可能需要根据具体需求调整噪音的大小和方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值