一、Matlab
读入任意一副灰度图片,请用Matlab程序实现以下功能:
1. 读取图片,图片反色(即255 - 像素灰度值),存储为jpg图片;
exp1_ex1.m
I = imread('../std_imgs/lena_gray_256.tif'); %读取灰度图片
I_invese = 255 - I; %反色
figure; %创建一个新的窗口
subplot(1,2,1);imshow(I) %显示原图像
subplot(1,2,2);imshow(I_invese,[]) %显示反色图像
imwrite(I_invese, 'lena_gray_256_invese.jpg'); %存储为jpg图片
2. 对该图片进行1/2,1/4,1/8,1/16,1/32缩放的图像空间分辨率显示,并存储为jpg图片;
exp1_ex2.m
I = imread('../std_imgs/lena_gray_256.tif'); %读取灰度图片
I_2 = imresize(imresize(I, 1/2), 2); %空间分辨率1/2缩放
I_4 = imresize(imresize(I, 1/4), 4); %1/4缩放
I_8 = imresize(imresize(I, 1/8), 8); %1/8缩放
I_16 = imresize(imresize(I, 1/16), 16); %1/16缩放
I_32 = imresize(imresize(I, 1/32), 32); %1/32缩放
figure;
subplot(2,3,1);imshow(I) %显示
subplot(2,3,2);imshow(I_2)
subplot(2,3,3);imshow(I_4)
subplot(2,3,4);imshow(I_8)
subplot(2,3,5);imshow(I_16)
subplot(2,3,6);imshow(I_32)
imwrite(I_2,'lena_gray_d2.jpg'); %存储为jpg图片
imwrite(I_4,'lena_gray_d4.jpg');
imwrite(I_8,'lena_gray_d8.jpg');
imwrite(I_16,'lena_gray_d16.jpg');
imwrite(I_32,'lena_gray_d32.jpg');
3. 实现图像的灰度分辨率图(1-8 bits),并存储为jpg图片;
imratio.m(转换灰度分辨率函数)
function R = imratio(I,ratio)
%IMRATIO 输出图像块的灰度分辨率图(1-8 bits)
% 将输入灰度图像的默认灰度级[0:255]整除(向下取整)到分辨率对应的灰度级
% I 输入灰度图像
% ratio 分辨率值
% R 输出相应的分辨率图
graylevel = fix(double(I)/(256/2^ratio)); % 按分辨率减少灰度级
R = uint8(graylevel*255/(2^ratio-1)); % 恢复默认灰度级[0:255]输出
end
exp1_ex3.m
I = imread('../std_imgs/lena_gray_256.tif'); %读取灰度图片
I_8bit = imratio(I,8); %8bits灰度分辨率图(=原图)
I_7bit = imratio(I,7); %7bits
I_6bit = imratio(I,6); %6bits
I_5bit = imratio(I,5); %5bits
I_4bit = imratio(I,4); %4bits
I_3bit = imratio(I,3); %3bits
I_2bit = imratio(I,2); %2bits
I_1bit = imratio(I,1); %1bit
figure;
subplot(4,2,1);imshow(I_8bit) %显示
subplot(4,2,2);imshow(I_7bit)
subplot(4,2,3);imshow(I_6bit)
subplot(4,2,4);imshow(I_5bit)
subplot(4,2,5);imshow(I_4bit)
subplot(4,2,6);imshow(I_3bit)
subplot(4,2,7);imshow(I_2bit)
subplot(4,2,8);imshow(I_1bit)
imwrite(I_8bit,'lena_gray_8bit.jpg'); %存储为jpg图片
imwrite(I_7bit,'lena_gray_7bit.jpg');
imwrite(I_6bit,'lena_gray_6bit.jpg');
imwrite(I_5bit,'lena_gray_5bit.jpg');
imwrite(I_4bit,'lena_gray_4bit.jpg');
imwrite(I_3bit,'lena_gray_3bit.jpg');
imwrite(I_2bit,'lena_gray_2bit.jpg');
imwrite(I_1bit,'lena_gray_1bit.jpg');
二、C++
//读入任意一副灰度图片(见附件 Std_imgs.zip),请用C++程序实现以下功能:
//
//1. 读取图片,图片反色(即用: 255 - 像素灰度值),存储为 jpg 图片;
//
//2. 对该图片截取为 256x256 的图像块,进行1 / 2, 1 / 4, 1 / 8, 1 / 16, 1 / 32 缩放的图像空间分辨率 显示(如图所示), 并存储为 jpg 图片;
//
//3. 实现 该 256x256 的图像 块的灰度分辨率图(1 - 8 bits) ,并 存储为 jpg 图片;
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
int main()
{
Mat ori_gray_image, out_gray_image1, out_gray_image2, out_gray_image3;
ori_gray_image = imread("..\\..\\std_imgs\\lena_gray_256.tif", IMREAD_GRAYSCALE); //读取文件夹中的灰度图像
//检测图像是否加载成功
if (ori_gray_image.empty()) //检测image有无数据,无数据 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) = 255 - ori_gray_image.at<uchar>(i, j);
}
}
//显示和存储反色图像
imshow("out_gray_image1", out_gray_image1);
imwrite("out_gray_image1.jpg", out_gray_image1);
//缩放
resize(ori_gray_image, out_gray_image2, Size(), 0.5, 0.5);
resize(out_gray_image2, out_gray_image2, Size(), 2, 2);
imshow("out_gray_image2", out_gray_image2);
//降低灰度分辨率
out_gray_image3 = ori_gray_image.clone();
int ratio = 1;
for (int i = 0; i < ori_gray_image.rows; i++)
{
for (int j = 0; j < ori_gray_image.cols; j++)
{
out_gray_image3.at<uchar>(i, j) = ori_gray_image.at<uchar>(i, j) / (256 / (int)pow(2, ratio)) * (255 / ((int)pow(2, ratio)-1));
}
}
imshow("out_gray_image3", out_gray_image3);
waitKey(0); //暂停,保持图像显示,等待按键结束
return 0;
}