一、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);
}
}
}