数字图像处理Malab/C++(二)灰度变换、图像直方图均衡化、平滑空间滤波、锐化空间滤波

一、Matlab

1、灰度变换实验。

从实验课专用图片中任意选取一张灰度图(记做图A1),使用通过灰度变换将它的灰度值调整到[0, 0.5]之间,结果记做图B1;

% 灰度变换实验。
% 从实验课专用图片中任意选取一张灰度图(记做图A1),使用通过灰度变换将它的灰度值调整到[0, 0.5]之间,
% 结果记做图B1;将原图以及所有结果显示在同一幅窗口中,观察现象,写出自己的心得体会。

A1 = imread('../std_imgs/lena_gray_256.tif'); %读取灰度图片
% B1 = uint8(fix(double(A1)/2));
B1 = imadjust(A1,[0,1],[0,0.5]); %灰度变换[0, 1]->[0, 0.5]
figure;
subplot(1,2,1),imshow(A1)
subplot(1,2,2),imshow(B1)

2、图像直方图实验。

1)任意选取一张灰度图(记做图A2),使用通过灰度变换将它的灰度值调整到[0, 0.5]之间(记做图B2);

2)根据直方图算法实现直方图均衡化程序(不能调用matlab自带函数),对B2进行直方图均衡化,结果记为C2;

% 图像直方图实验。
% 1)任意选取一张灰度图(记做图A2),使用通过灰度变换将它的灰度值调整到[0, 0.5]之间(记做图B2);
% 2)根据直方图算法实现直方图均衡化程序(不能调用matlab自带函数),对B2进行直方图均衡化,结果记为C2;
% 如上显示结果,观察现象。

A2 = imread('../std_imgs/lena_gray_256.tif'); %读取灰度图片
B2 = imadjust(A2,[0,1],[0,0.5]); %灰度变换
C2 = hisro(B2); %自定义直方图均衡化函数
% C2 = histeq(B2,256); %工具箱直方图均衡化函数
figure;
subplot(1,3,1);imshow(A2);title('原始图像');
subplot(1,3,2);imshow(B2);title('灰度变换图像');
subplot(1,3,3);imshow(C2);title('直方图均衡化图像');

hisro.m(自定义直方图均衡化函数)

function outImage = hisro(image)
%HISRO 直方图均衡化

% 首先读入灰度图像,并提取图像的高度和宽度
[height, width] = size(image); 
% 然后统计每个灰度的像素值的累计数目
NumPixel = zeros(1,256); % 建立一个256列的行向量,以统计各灰度级的像素个数
for i = 1 : height
for j = 1 : width
k = image(i,j); % k是像素点(i,j)的灰度值
% 因为NumPixel数组的下标是从1开始的,但是图像像素的取值范围是0~255
% 所以用NumPixel(k+1)
NumPixel(k+1) = NumPixel(k+1) + 1; % 对应灰度值像素点数量加1 
end
end
% % 这里我们将数组NumPixel显示出来,以观测效果
figure;
subplot(121), imshow(image);title('原始图像');
% subplot(122), bar(NumPixel);title('原始图像直方图'); % 灰度图像的直方图可以正确显示出来
subplot(122), imhist(image);title('原始图像直方图');

% 接下来,将频数值算为频率
ProbPixel = zeros(1,256); % 统计各灰度级出现的频率
for i = 1 : 256
ProbPixel(i) = NumPixel(i) / (height * width);
end
% % 这里我们将数组ProbPixel显示出来,以观测效果
figure;
subplot(121), imshow(image);title('原始图像');
subplot(122), bar(ProbPixel);title('原始图像归一化直方图'); % 灰度图像的归一化直方图可以正确显示出来
% 再用函数cumsum()来计算累积分布函数(CDF),并将频率(取值范围是0~1)映射到0~255的无符号整数
CumPixel = cumsum(ProbPixel); % 这里的数组CumPixel大小也是1×256
CumPixel = uint8((256-1) .* CumPixel + 0.5); 

% % 这里我们将数组CumPixel显示出来,以观测效果
figure;
subplot(121), imshow(image);title('原始图像');
subplot(122), bar(CumPixel);title('CDF累加求和'); % 数组CumPixel可以正确显示出来 
% 在下列用作直方图均衡化实现的赋值语句右端,image(i,j)被用来作为CumPixel的索引
% 例如,image(i,j)=120,则从CumPixel中取出第120个值作为image(i,j)的新像素值
outImage = uint8(zeros(height, width)); % 预分配数组
for i = 1 : height
for j = 1 : width
outImage(i,j) = CumPixel(image(i,j)+1);
end
end

figure;
subplot(121), imshow(outImage);title('直方图均衡化图像');
subplot(122), imhist(outImage);title('均衡化后直方图'); 

 

3、平滑空间滤波器实验。

1)任意选取一张灰度图(记做图A3),给图像A3加入高斯噪声,结果记做图B3;

2)实现3x3均值滤波器程序(不调用matlab自带函数),对B3进行平滑滤波,结果记为C3;

% 平滑空间滤波器实验。
% 1)任意选取一张灰度图(记做图A3),给图像A3加入高斯噪声,结果记做图B3;
% 2)实现3x3均值滤波器程序(不能调用matlab自带函数),对B3进行平滑滤波,结果记为C3;
% 如上显示结果,观察现象。

A3 = imread('../std_imgs/lena_gray_256.tif'); %读取灰度图片
B3 = imnoise(A3,"gaussian",0,0.01); %加入高斯噪声
I = double(padarray(B3,[1 1],'replicate')); %padding
[m,n] = size(B3);
C3 = zeros(m,n);
for i = 1:m 
for j = 1:n
%3x3均值滤波
C3(i,j) = (I(i,j)+I(i+1,j)+I(i+2,j)+I(i,j+1)+I(i+1,j+1)+I(i+2,j+1)+I(i,j+2)+I(i+1,j+2)+I(i+2,j+2))/9;
end
end

figure;
subplot(1,3,1),imshow(A3);title('原图像');
subplot(1,3,2),imshow(B3);title('加入高斯噪声');
subplot(1,3,3),imshow(uint8(C3));title('3X3均值滤波器');

4、锐化空间滤波器实验。

1)任意选取一张灰度图(记做图A4),使用通过5x5的高斯核对图像A4进行模糊,结果记为B4;

2)使用中心系数为正的拉普拉斯算子对B4进行锐化提升图像质量,结果记为C4;

3)使用高提升滤波对B4进行锐化提升图像质量,结果记为D4

% 锐化空间滤波器实验。
% 1)任意选取一张灰度图(记做图A4),使用通过5x5的高斯核对图像A4进行模糊,结果记为B4;
% 2)使用中心系数为正的拉普拉斯算子对B4进行锐化提升图像质量,结果记为C4;
% 3)使用高提升滤波对B4进行锐化提升图像质量,结果记为D4。如上显示结果,观察现象。

A4 = imread('../std_imgs/lena_gray_256.tif'); %读取灰度图片
%使用通过5x5的高斯核对图像A4进行模糊
w1 = fspecial("gaussian",[5 5],0.5);
B4 = imfilter(A4,w1,"replicate"); 
%使用中心系数为正的拉普拉斯算子对B4进行锐化
dB4 = double(B4);
w2 = -fspecial("laplacian",0); %中心系数为4 
dC4 = imfilter(dB4,w2,"replicate"); 
C4 = dB4+dC4;
%使用高提升滤波对B4进行锐化提升图像质量
w3 = fspecial("gaussian",[5 5],3);
mask = dB4-imfilter(dB4,w3,"replicate");
k = 2; %k>1,高提升滤波
D4 = dB4+k.*mask;

figure;
subplot(1,4,1),imshow(A4);title('原图像');
subplot(1,4,2),imshow(B4,[]);title('5x5高斯低通滤波器');
subplot(1,4,3),imshow(uint8(C4),[]);title('中心系数为4的拉普拉斯算子');
subplot(1,4,4),imshow(uint8(D4),[]);title('高提升滤波');

 

二、C++

//1、灰度变换实验。
//1)从实验课专用图片中任意选取一张灰度图(记做图A1),使用通过灰度变换将它的灰度值调整到[0, 0.5]之间, 结果记做图B1;将原图以及所有结果显示在同一幅窗口中,观察现象,写出自己的心得体会。
//
//2、图像直方图实验。
//1)任意选取一张灰度图(记做图A2),使用通过灰度变换将它的灰度值调整到[0, 0.5]之间(记做图B2);
//2)根据直方图算法实现直方图均衡化程序(不能调用matlab自带函数),对B2进行直方图均衡化,结果记为C2;如上显示结果,观察现象。
//
//3、平滑空间滤波器实验。
//1)任意选取一张灰度图(记做图A3),给图像A3加入高斯噪声,结果记做图B3;
//2)实现3x3均值滤波器程序(不能调用matlab自带函数),对B3进行平滑滤波,结果记为C3;如上显示结果,观察现象。
//
//4、锐化空间滤波器实验。
//1)任意选取一张灰度图(记做图A4),使用通过5x5的高斯核对图像A4进行模糊, 结果记为B4;
//2)使用中心系数为正的拉普拉斯算子对B4进行锐化提升图像质量,结果记为C4;
//3)使用高提升滤波对B4进行锐化提升图像质量,结果记为D4。如上显示结果,观察现象。

#include<opencv2/opencv.hpp>
#include<iostream>

using namespace cv;
using namespace std;

//定义滤波函数
void myfilter(Mat& image_input, Mat& image_output); //四邻域
void myfilter2(Mat& image_input, Mat& image_output); //八邻域

int main()
{
	Mat ori_gray_image, out_gray_image1, out_gray_image2, out_gray_image3, out_gray_image4, out_gray_image5;

	ori_gray_image = imread("..\\..\\std_imgs\\lena_gray_256.tif", IMREAD_GRAYSCALE);  //读取文件夹中的灰度图像

	//检测图像是否加载成功
	if (ori_gray_image.empty())  
	{
		cout << "Could not open or find the image" << endl;
		return -1;
	}

	//显示原图像
	imshow("ori_gray_image", ori_gray_image);  

	//灰度变换
	out_gray_image1 = ori_gray_image.clone();
	for (int i = 0; i < ori_gray_image.rows; i++)
	{
		for (int j = 0; j < ori_gray_image.cols; j++)
		{
			out_gray_image1.at<uchar>(i, j) = ori_gray_image.at<uchar>(i, j) / 2;
		}
	}
	imshow("out_gray_image1", out_gray_image1);

	//直方图均衡化
	equalizeHist(out_gray_image1, out_gray_image2);
	imshow("out_gray_image2", out_gray_image2);

	//平滑空间滤波
	//blur(ori_gray_image, out_gray_image3, Size(3, 3));

	//锐化空间滤波
	Mat GaussianBlur_image;
	GaussianBlur(ori_gray_image, GaussianBlur_image, Size(5, 5), 2.0, 2.0);	//高斯模糊
	imshow("GaussianBlur_image", GaussianBlur_image);
	myfilter(GaussianBlur_image, out_gray_image4); //4邻域拉普拉斯锐化滤波
	imshow("out_gray_image4", out_gray_image4);
	myfilter2(GaussianBlur_image, out_gray_image5); //8邻域拉普拉斯锐化滤波
	imshow("out_gray_image5", out_gray_image5);

	waitKey(0);  //暂停,保持图像显示,等待按键结束

	return 0;

}

void myfilter(Mat& image_input, Mat& image_output) //4
{
	image_output = image_input.clone();
	int la;
	for (int i = 1; i < (image_input.rows - 1); i++)
	{
		for (int j = 1; j < (image_input.cols - 1); j++)
		{
			la = 4 * image_input.at<uchar>(i, j) - image_input.at<uchar>(i + 1, j) - image_input.at<uchar>(i - 1, j) - image_input.at<uchar>(i, j + 1) - image_input.at<uchar>(i, j - 1);

			image_output.at<uchar>(i, j) = saturate_cast<uchar>(image_output.at<uchar>(i, j) + la);

		}
	}
}

void myfilter2(Mat& image_input, Mat& image_output) //8
{
	image_output = image_input.clone();
	int la2;
	for (int i = 1; i < (image_input.rows - 1); i++)
	{
		for (int j = 1; j < (image_input.cols - 1); j++)
		{
			la2 = 8 * image_input.at<uchar>(i, j) - image_input.at<uchar>(i + 1, j) - image_input.at<uchar>(i - 1, j) - image_input.at<uchar>(i, j + 1) - image_input.at<uchar>(i, j - 1)
				- image_input.at<uchar>(i - 1, j - 1) - image_input.at<uchar>(i + 1, j + 1) - image_input.at<uchar>(i - 1, j + 1) - image_input.at<uchar>(i + 1, j - 1);

			image_output.at<uchar>(i, j) = saturate_cast<uchar>(image_output.at<uchar>(i, j) + la2);

		}
	}
}

  • 6
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值