1. 实验目的
①熟悉 Photoshop 基本操作;
②掌握 Matlab 、Python+OpenCV 中处理图像的基本方法;
③掌握图像的半调转换和抖动转换。
2. 实验内容
①Photoshop 基本操作:打开图像文件,选择区域,旋转、裁剪图像、图层操作;
②Matlab 、Python+OpenCV 基本操作:读入图像,改变图像尺寸,旋转、裁剪图像,计算图像的基本特征指标。
③使用 Matlab 完成图像的半调转换和抖动转换并显示结果。
3. 实验过程
3. 1 Photoshop 图像基本操作
① 实验步骤(需详细介绍每一步实验步骤)
(1) 打开图像文件:
下载好PS打开后,可以通过打开选择图片,也可以直接拖图片进工作区。
(2) 选择区域:
根据选择图片内容有以下几种选区方式:
简单几何形状:
如果需要选择一个简单的矩形或椭圆形区域,使用矩形选框工具或椭圆选框工具。
复杂形状:
如果需要选择一个不规则的形状,使用套索工具或多边形套索工具。
(3) 裁剪图像:
选择裁剪工具
,对图像进行裁剪。
(4)旋转图像:
通过菜单栏里的图像->图像旋转调整图像,支持自定义角度和方向。
(5)图层操作:(包括图层的创建,复制,删除,锁定,合并,显示隐藏图层和更改图层顺序)
创建新图层:
点击图层面板底部的“新建图层”图标;或者,通过菜单栏选择“图层” > “新建” > “图层”。
复制图层:
右键点击图层面板中的图层,选择“复制图层”。
或者按住 Alt 键,然后拖动图层到图层面板底部的“新建图层”图标上。
删除图层:
右键点击图层面板中的图层,选择“删除”。
或者,选中图层后,点击图层面板底部的垃圾桶图标。
锁定图层:
在图层面板中,每个图层旁边有锁定图标,点击可以锁定透明像素、像素、位置等。
合并图层:
选中你想要合并的图层,右键点击并选择“合并图层”。
或者,使用快捷键 Ctrl + E。
显示/隐藏图层:
在图层面板中,点击图层左侧的眼睛图标可以切换图层的显示或隐藏。
更改图层顺序:
直接点击并拖动图层面板中的图层到你想要的位置。
② 实验结果展示
(1)打开图片:
(2)选择主体部分如图:
(3)裁剪图像结果如图:
(4)旋转效果如图:
(5)新建图层如图,同时可以通过“锁”的图标进行图层锁定操作:
复制图层如图:
按照步骤删除图层会出现以下提示:
隐藏图层如图:
3.2 Matlab 、Python+OpenCV 图像基本操作
3.2. 1 Matlab 实现:
使用 Matlab 编写代码完成读入图像,改变图像尺寸,旋转、裁剪图像, 计算图像的基本特征指标等功能并展示结果。
①主要函数及其参数
请填写 以下Matlab 函数对应的参数说明:
imread(filename) | filename:要读取的图像文件的名称或路径 |
imfinfo (filename) | filename:图像文件的名称或路径 |
translate(SE, [y x]) | SE:要平移的结构元素或图像。 [y x]:平移的向量,其中 y 是垂直方向的平移量,x 是水平方向的平移量 |
imrotate(img,30); | img:要旋转的图像 angle:旋转的角度,正值表示逆时针旋转,负值表示顺时针旋转,30表示逆时针旋转30° |
imresize(img,a,‘method’) | img:要改变尺寸的图像 a:新的尺寸,可以是一个标量或 [height, width] 形式的向量 'method':插值方法,例如 'nearest'(最近邻插值)、'bilinear'(双线性插值)、'bicubic'(双三次插值)等 |
close() | 无参数或者可以指定要关闭的图形窗口的句柄 |
subplot(m,n,p) | m:子图的行数 n:子图的列数 p:当前子图的索引 |
rgb2gray(image) | image:要转换的 RGB 彩色图像 |
imcomplement(image) | image:要计算补色的图像,通常为灰度或二值图像 |
② 实验代码展示
% 读入图像
filename = 'example.jpg';
originalImg = imread(filename);
% 显示原始图像
figure('Position', [100 100 800 600]); % 设置图形窗口的位置和大小
subplot(2, 3, 1);
imshow(originalImg);
title('Original Image');
% 改变图像尺寸
resizedImg = imresize(originalImg, 0.3); % 缩小到原来的50%
% 显示改变尺寸后的图像
subplot(2, 3, 2);
imshow(resizedImg);
title('Resized Image');
% 旋转图像
rotatedImg = imrotate(originalImg, 30); % 逆时针旋转30度
% 显示旋转后的图像
subplot(2, 3, 3);
imshow(rotatedImg);
title('Rotated Image');
% 裁剪图像
cropRect = [100, 100, 200, 200]; % [x, y, width, height]
croppedImg = imcrop(originalImg, cropRect);
% 显示裁剪后的图像
subplot(2, 3, 4);
imshow(croppedImg);
title('Cropped Image');
% 计算均值
meanValue = sum(binLocations .* counts) / sum(counts);
% 计算标准差
stdValue = sqrt(sum((binLocations - meanValue).^2 .* counts) / sum(counts));
% 计算偏度
skewnessValue = sum(((binLocations - meanValue).^3 .* counts) / sum(counts)) / stdValue^3;
% 计算峰度
kurtosisValue = sum(((binLocations - meanValue).^4 .* counts) / sum(counts)) / stdValue^4 - 3;
% 显示结果
fprintf('均值:%.2f\n', meanValue);
fprintf('标准差:%.2f\n', stdValue);
fprintf('偏度:%.2f\n', skewnessValue);
fprintf('峰度:%.2f\n', kurtosisValue);
% 计算图像的基本特征指标
info = imfinfo(filename); % 获取图像文件信息
[rows, cols, dim] = size(originalImg);
% 显示图像特征
subplot(2, 3, 5);
text(0, 0, sprintf('Size: %dx%d', cols, rows), 'Units', 'normalized', 'FontSize', 10);
text(0, 0.2, sprintf('Bit Depth: %d', info.BitDepth), 'Units', 'normalized', 'FontSize', 10);
text(0, 0.4, sprintf('Number of Color Channels: %d', dim), 'Units', 'normalized', 'FontSize', 10);
axis off;
title('Image Features');
% 计算图像的直方图并显示
I = imread('example.jpg');
I_gray = rgb2gray(I);
histogramImg = imhist(I_gray);
% 显示直方图
subplot(2, 3, 6);
bar(histogramImg);
title('Histogram');
xlim([0 255]);
③ 实验结果展示
注:此处的直方图是读取的单通道,因为先将RGB转为灰度图像,才进行的直方图绘制。
3.2.2 Python+OpenCV 实现
使用 Python+OpenCV 库编写代码完成读入图像,改变图像尺寸,旋转、 裁剪图像,计算图像的基本特征指标等功能并展示结果。
- 主要函数及其参数
请填写以下函数对应的参数说明:
cv.imread(filename, [flags]) | filename:要读取的图像文件的路径。 [flags]:可选参数,指定读取图像的方式。它可以是以下值之一: cv.IMREAD_UNCHANGED:默认值,读取图像包括alpha通道 cv.IMREAD_GRAYSCALE:以灰度模式读取图像 cv.IMREAD_COLOR:以彩色模式读取图像(任何透明度的通道都会被忽略) |
cv2.rotate | src:要旋转的原始图像 rotationCode:旋转的角度或旋转中心点和缩放比例。它可以是以下值之一: cv2.ROTATE_90_CLOCKWISE:顺时针旋转90度 cv2.ROTATE_180:旋转180度 cv2.ROTATE_90_COUNTERCLOCKWISE:逆时针旋转90度 或者,可以传递一个(center, scale)元组,其中center是旋转中心点,scale是缩放比例。 |
cv2.resize | src:要调整尺寸的原始图像 dsize:元组(width, height),指定新的图像尺寸。如果为(0, 0),则计算新的尺寸基于fx和fy fx:水平缩放因子。如果dsize是(0, 0),则使用该值 fy:垂直缩放因子。如果dsize是(0, 0),则使用该值 interpolation:插值方法,指定如何进行尺寸调整。它可以是以下值之一: cv2.INTER_NEAREST:最近邻插值 cv2.INTER_LINEAR:双线性插值(默认) cv2.INTER_CUBIC:双三次插值。cv2.INTER_AREA:区域插值cv2.INTER_LANCZOS4:Lanczos插值 |
② 实验代码展示
import cv2
import numpy as np
# 读入图像
image_path = 'example.jpg' # 替换为你的图像文件路径
img = cv2.imread(image_path)
# 改变图像尺寸
resized_img = cv2.resize(img, (0, 0), fx=0.5, fy=0.5) # 缩小到原来的50%
# 旋转图像
rotated_img = cv2.rotate(img, cv2.ROTATE_90_CLOCKWISE) # 逆时针旋转90度
# 裁剪图像
cropped_img = img[100:200, 100:200] # 裁剪图像的(100,100)到(200,200)的区域
# 计算图像的基本特征指标
# 均值
mean_value = cv2.mean(img)[:3] # 返回BGR通道的均值
# 标准差
std_dev = cv2.mean(img)[3] # 返回BGR通道的标准差
# 显示原始图像和处理后的图像
cv2.imshow('Original Image', img)
cv2.imshow('Resized Image', resized_img)
cv2.imshow('Rotated Image', rotated_img)
cv2.imshow('Cropped Image', cropped_img)
# 显示图像特征指标
print(f'Mean Value (BGR): {mean_value}')
print(f'Standard Deviation: {std_dev}')
# 等待键盘事件,然后关闭所有窗口
cv2.waitKey(0)
cv2.destroyAllWindows()
③ 实验结果展示
注:图片显示待优化,可以尝试将四个图放在一个画布上,但是画布要设计合理。
3.3 图像的半调转换和抖动转换。
3.3. 1 图像的半调转换
使用 Matlab 编写代码并读取一张图像,完成4×4 的半调转换并显示原图和结果。
① 实验代码展示
% 读取图像
img = imread('example.jpg'); % 替换为你的图像文件路径
% 转换为灰度图像
grayImg = rgb2gray(img);
% 将灰度图像缩放到0到1的范围
grayImg = double(grayImg) / 255;
% 创建一个4x4的半调图案
halftoneMatrix = zeros(4, 4);
halftoneMatrix(1,1) = 1;
halftoneMatrix(2,2) = 1;
halftoneMatrix(3,3) = 1;
halftoneMatrix(4,4) = 1;
% 将半调图案扩展到整个图像的大小
halftoneMatrix = repmat(halftoneMatrix, [ceil(size(grayImg, 1)/4), ceil(size(grayImg, 2)/4)]);
halftoneMatrix = halftoneMatrix(1:size(grayImg, 1), 1:size(grayImg, 2));
% 应用半调图案
halftoneImg = grayImg .* halftoneMatrix;
% 将处理后的图像转换回uint8类型,以便显示
halftoneImg = uint8(halftoneImg * 255);
% 显示原图和半调转换后的图像
figure;
subplot(1, 2, 1);
imshow(grayImg);
title('Original Grayscale Image');
subplot(1, 2, 2);
imshow(halftoneImg);
title('Halftone Image');
② 实验结果展示
3.3.2 图像的抖动转换
(1)调用 Matlab 中的抖动函数,dither 。观察原图和抖动转换后的结果。
① 实验代码展示
% 读取灰度图像
img = imread('example.jpg');
grayImg = rgb2gray(img);
% 使用抖动函数将灰度图像转换为二值图像
bwImg = dither(grayImg);
% 显示原图和抖动后的图像
figure;
subplot(1, 2, 1);
imshow(grayImg);
title('Original Grayscale Image');
subplot(1, 2, 2);
imshow(bwImg);
title('Dithered Binary Image');
② 实验结果展示
(2) 调用 Python pilow 库中的 convert 函数,将下面手写数字图像,转换为二值图像。并尝试改变参数,观察有抖动和没有抖动时,二值化的结果有何不同。
图 1 手写数字 4
① 实验代码展示
from PIL import Image
# 打开图像文件
img_path = 'handwritten_digit.png' # 替换为您的手写数字图像文件路径
img = Image.open(img_path)
# 转换为灰度图像
gray_img = img.convert('L')
# 二值化处理,没有抖动
threshold_no_dither = 128 # 二值化的阈值
bw_img_no_dither = gray_img.point(lambda p: p > threshold_no_dither and 255)
# 二值化处理,有抖动
bw_img_dither = gray_img.convert('1', dither=Image.FLOYDSTEINBERG)
# 显示原图、没有抖动的二值图像和有抖动的二值图像
img.show(title='Original Image')
bw_img_no_dither.show(title='Binary Image without Dithering')
bw_img_dither.show(title='Binary Image with Dithering')
② 实验结果展示
下边分别是原图、没有抖动的二值图像和有抖动的二值图像。
4. 实验小结
①在安装 Matlab 和 OpenCV 库时,你遇到了哪些问题,是如何解决的。
答:无问题
②查阅相关资料,了解不同抖动算法的种类,并探究在原理和实验结果上, 它们之间有什么区别?
答:在图像处理中,抖动算法是一种通过在图像中添加特定模式的噪声来改善图像视觉效果的技术。主要的抖动算法包括:
有序抖动(Ordered Dithering):这种算法使用一个固定的矩阵,如4x4或8x8的图案,来决定哪些像素被修改。这种方法的特点是图案是有序的,因此通常会产生一种规则的噪声模式。有序抖动的效果相对稳定,但可能缺乏自然感。
随机抖动(Random Dithering):与有序抖动不同,随机抖动使用随机分布的噪声来修改像素值。这种方法可以产生更自然的视觉效果,但结果可能不够稳定,且对不同图像的效果差异可能较大。
误差扩散抖动(Error Diffusion Dithering):这是一种更高级的抖动技术,它不仅考虑当前像素,还考虑相邻像素的值来决定如何分配颜色。这种方法可以产生非常平滑的渐变效果,但计算量较大,且可能会引入一些视觉上的噪声。
在实验结果上,有序抖动通常会产生清晰的图案效果,适合于需要规则图案的应用。随机抖动则更适合于需要更自然视觉效果的应用,但可能需要更多的实验来找到最佳的噪声模式。误差扩散抖动则在需要高视觉质量的应用中表现最佳,尤其是在处理渐变和细腻色彩变化时。
在实际应用中,选择哪种抖动算法取决于具体的应用场景和所需的视觉效果。例如,在打印或显示设备中,可能更倾向于使用误差扩散抖动来提高图像质量;而在一些需要快速处理且对视觉效果要求不是非常高的应用中,有序或随机抖动可能更为合适。