实验3 图像基本运算

1. 实验目的

①掌握Photoshop中直方图工具,色阶,曲线工具的使用方法;
②掌握图像代数/逻辑运算的主要原理和方法;
③掌握图像灰度变换和直方图均衡化的主要原理和方法。

2. 实验内容

①使用Photoshop 中的直方图工具,观察和理解图像和直方图之间的关系。使用色阶、曲线工具,调整图像颜色,并实现均衡化;
②在Matlab / Python+OpenCV中,实现图像的代数/逻辑运算;
③在Matlab / Python+OpenCV中,实现图像的灰度变换和直方图均衡化。

3. 实验过程

3.1 使用Photoshop处理图像

3.1.1 使用直方图工具,观察和理解图像和直方图之间的关系
① 实验步骤

② 实验结果
在这里插入图片描述
③ 实验结论
结合ps提供的直方图工具,可以清楚的看到该张图片内不同像素颜色的分布情况
3.1.2 使用色阶、曲线工具调整图像颜色
① 实验步骤
按下ctrl+L快捷键,即可调出色阶窗口。
在这里插入图片描述

② 实验结果(添加色阶,曲线调整前后参数及调整结果图像)

在这里插入图片描述
由上可知,随着色阶的变化,图像也会随之产生变化。
③ 实验结论
色阶调整可以增加图像的对比度:通过拉伸图像的亮度范围,色阶调整可以增加图像中不同灰度级别的距离,使得图像的黑白点更加明显,从而增强图像的对比度。

3.2 图像代数/逻辑运算

使用Matlab或Python编写代码,完成图像的代数运算和逻辑运算,并展示原图以及实验结果。要求结果尽可能美观、有创意。
① 实验步骤
使用matlab编写代码,完成上述实验要求,分别对图像进行代数运算和逻辑运算。

% 将图像进行四则运算
 
% 读取原始图像
originalImage = imread('lena.png');
 
% 创建另一个图像作为运算的第二个操作数(与原始图像具有相同的尺寸)
secondImage = imread('lena.png');
 
% 图像加法
additionResult = imadd(originalImage, secondImage);
 
% 图像减法
subtractionResult = imsubtract(originalImage, secondImage);
 
% 图像乘法
multiplicationResult = immultiply(originalImage, secondImage);
 
% 图像除法
divisionResult = imdivide(originalImage, secondImage);
 
% 显示原始图像和实验结果
figure;
subplot(2, 2, 1), imshow(originalImage), title('原始图像');
subplot(2, 2, 2), imshow(additionResult), title('加法结果');
subplot(2, 2, 3), imshow(subtractionResult), title('减法结果');
subplot(2, 2, 4), imshow(multiplicationResult), title('乘法结果');


% 将图像进行逻辑运算
% 读取两个输入图像
image1 = imread('lena.png');
image2 = imread('lena.png');
 
% 调整图像的尺寸,确保它们具有相同的大小
image1 = imresize(image1, [size(image2, 1), size(image2, 2)]);
 
% 进行逻辑运算
logical_and = bitand(image1, image2);
logical_or = bitor(image1, image2);
logical_xor = bitxor(image1, image2);
logical_not = bitcmp(image1);
 
% 显示原始图像和逻辑运算结果
subplot(2, 3, 1), imshow(image1), title('Image 1');
subplot(2, 3, 2), imshow(image2), title('Image 2');
subplot(2, 3, 3), imshow(logical_and), title('Logical AND');
subplot(2, 3, 4), imshow(logical_or), title('Logical OR');
subplot(2, 3, 5), imshow(logical_xor), title('Logical XOR');
subplot(2, 3, 6), imshow(logical_not), title('Logical NOT (Image 1)');

③ 实验结果

在这里插入图片描述
在这里插入图片描述

3.3灰度变换和直方图均衡化

3.3.1 图像的灰度变换
在Matlab / Python中,调用相关函数,完成图像的灰度变换操作,包括线性变换、伽马变换、阈值变换(二值化)等,分别使用不同的参数观察灰度变换效果。
① 实验步骤

② 代码

% 读取图像
image = imread('lena.png');

% 线性变换
linear_transformed = imadjust(image, [0.2 0.8], []);

% 伽马变换
gamma = 0.5; % 伽马值
gamma_transformed = imadjust(image, [], [], gamma);
%转换为灰度图像
gray_image = rgb2gray(image);
% 阈值变换(二值化)
threshold = 32; % 阈值
binary_image = imbinarize(gray_image, threshold/255);

% 显示原始图像和灰度变换结果
subplot(2, 2, 1), imshow(image), title('原始图像');
subplot(2, 2, 2), imshow(linear_transformed), title('线性变换');
subplot(2, 2, 3), imshow(gamma_transformed), title('伽马变换');
subplot(2, 2, 4), imshow(binary_image), title('阈值变换(二值化)');

③ 实验结果

在这里插入图片描述
3.3.2 直方图均衡化和直方图规定化
先在Matlab/OpenCV+Python中,调用相关函数,实现直方图均衡化和直方图规定化。然后不调用相关函数,自行编写代码,实现直方图均衡化。
(1) 调用相关函数,实现直方图均衡化和直方图规定化

① 请填写以下函数所对应的参数说明:

函数功能和参数
imhist(i,n)imhist(i,n) 是Matlab中用于计算图像直方图的函数,其中 i 是输入图像,n 是可选参数,用于指定直方图的 bin(柱)的数量
histeq(h,n)histeq(h,n) 是Matlab中用于直方图均衡化的函数,其中 h 是输入图像,n 是可选参数,用于指定输出图像的灰度级数

②代码展示
直方图均衡化

import cv2

# 读取图像
image = cv2.imread('lena.png', 0)

# 应用直方图均衡化
equalized_image = cv2.equalizeHist(image)

# 显示原始图像和均衡化后的图像
cv2.imshow('Original Image', image)
cv2.imshow('Equalized Image', equalized_image)

cv2.waitKey(0)
cv2.destroyAllWindows()

直方图规定化

import cv2
import numpy as np

# 读取图像
image = cv2.imread('lena.png', 0)

# 计算图像的直方图
hist, bins = np.histogram(image.flatten(), 256, [0, 256])

# 计算累积分布函数(CDF)
cdf = hist.cumsum()
cdf_normalized = cdf * hist.max() / cdf.max()

# 应用直方图规定化
normalized_image = np.interp(image.flatten(), bins[:-1], cdf_normalized).reshape(image.shape)

# 显示原始图像和规定化后的图像
cv2.imshow('Original Image', image)
cv2.imshow('Normalized Image', normalized_image)

cv2.waitKey(0)
cv2.destroyAllWindows()

③实验结果
直方图均衡化
在这里插入图片描述

直方图规定化

在这里插入图片描述
(2) 自行编写代码,实现直方图均衡化。
①代码展示
直方图均衡化

import cv2
import numpy as np


def histogram_equalization(image):
    # 将图像转换为灰度图像
    gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

    # 计算图像的直方图
    hist, bins = np.histogram(gray_image.flatten(), 256, [0, 256])

    # 计算累积分布函数(CDF)
    cdf = hist.cumsum()
    cdf_normalized = cdf * hist.max() / cdf.max()

    # 应用直方图均衡化
    equalized_image = np.interp(gray_image.flatten(), bins[:-1], cdf_normalized).reshape(gray_image.shape)

    # 将结果图像转换为8位无符号整数类型
    equalized_image = equalized_image.astype(np.uint8)

    return equalized_image


# 读取图像
image = cv2.imread('lena.png')

# 应用直方图均衡化
equalized_image = histogram_equalization(image)

# 显示原始图像和均衡化后的图像
cv2.imshow('Original Image', image)
cv2.imshow('Equalized Image', equalized_image)

cv2.waitKey(0)
cv2.destroyAllWindows()

直方图规定化

import cv2
import numpy as np

def histogram_normalization(image):
    # 将图像转换为灰度图像
    gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    
    # 计算图像的直方图
    histogram = cv2.calcHist([gray_image], [0], None, [256], [0, 256])
    
    # 计算累积分布函数(CDF)
    cdf = histogram.cumsum()
    cdf_normalized = cdf * histogram.max() / cdf.max()
    
    # 应用直方图规定化
    normalized_image = cv2.normalize(gray_image, None, alpha=0, beta=1, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_32F)
    normalized_image = normalized_image.astype(np.uint8)
    
    return normalized_image

# 读取图像
image = cv2.imread('input.jpg')

# 应用直方图规定化
normalized_image = histogram_normalization(image)

# 显示原始图像和规定化后的图像
cv2.imshow('Original Image', image)
cv2.imshow('Normalized Image', normalized_image)

cv2.waitKey(0)
cv2.destroyAllWindows()

②实验结果
直方图均衡化
在这里插入图片描述
直方图规定化

在这里插入图片描述

4. 实验小结

①色阶和曲线工具都能对图像的主通道和各分通道进行色彩调节。因此有人说,色阶工具是简易版本的曲线工具。请根据实验情况,从操作难度,成像效果等多种角度比较二者的异同。
答:操作难度:
色阶工具通常较为简单易懂,它提供了直观的黑白点和中间灰点控制,用户可以通过拖动这些控制点来调整图像的亮度、对比度和色彩分布。
曲线工具相对更为复杂,它提供了一个曲线图表,用户可以在图表上自定义曲线形状,通过调整控制点来精确调整图像的亮度和色彩分布。
功能灵活性:
色阶工具的功能相对较为简单,它主要用于调整图像的整体亮度、对比度和色彩分布。用户可以通过设置黑白点来拉伸图像的亮度范围,从而增强图像的对比度。
曲线工具更加灵活,因为用户可以在曲线图表上自定义调整曲线。这使得用户可以更精确地控制图像的亮度和色彩分布,例如通过增加或减少特定亮度区域的曲线斜率来调整图像的局部对比度。
成像效果:
色阶工具可以提供一定程度上的亮度和对比度调整,但对于复杂的图像调整需求,它的调节范围可能有限。
曲线工具能够更细致地调整图像的亮度和色彩分布,因此在处理需要更精确控制的图像调整任务时,曲线工具通常能够提供更好的成像效果。

②在进行图像代数/逻辑运算时,我们会根据不同的需要,选择不同的运算。例如添加水印时,我们可以对图像采用加法运算。根据实验结果,想一想,其他图像代数/逻辑运算可以应用在什么场景下,达到怎样的效果?
答:
加法运算:
应用场景:添加水印、图像叠加、图像融合等。
效果:将两幅图像进行逐像素相加,可以在保留原始图像信息的同时添加额外的图像内容。
减法运算:
应用场景:图像差异检测、图像去噪等。
效果:将两幅图像的对应像素进行逐像素相减,可以检测图像之间的差异或去除噪声。
乘法运算:
应用场景:图像融合、图像增强等。
效果:将两幅图像的对应像素进行逐像素相乘,可以实现图像的融合效果或增强特定区域的细节。
除法运算:
应用场景:图像纠偏、图像纠正等。
效果:将两幅图像的对应像素进行逐像素相除,可以实现图像的纠偏或纠正,消除图像中的畸变。
逻辑与运算:
应用场景:图像分割、图像蒙版等。
效果:将两幅图像的对应像素进行逐像素逻辑与操作,可以实现图像的分割或创建蒙版效果。
逻辑或运算:
应用场景:图像合成、图像融合等。
效果:将两幅图像的对应像素进行逐像素逻辑或操作,可以将两幅图像的内容进行融合或合成。

③根据实验情况,说明在图像出现过亮,过暗,对比度不足的情况时,应该如何设计灰度变换函数?
答:
线性变换:
线性变换函数形式:g(x) = a * f(x) + b
应用场景:
过亮图像:选择 a < 1 和 b > 0,降低亮度并增加对比度。
过暗图像:选择 a > 1 和 b < 0,增加亮度并增加对比度。
对比度不足:选择 a > 1 或 a < 1,增强对比度。
对数变换:
对数变换函数形式:g(x) = c * log(1 + f(x))
应用场景:
过亮图像:降低光照强度,增加图像细节。
过暗图像:增加光照强度,增强图像显示。
对比度不足:增强低灰度级的细节,减小高灰度级的细节。
幂次变换:
幂次变换函数形式:g(x) = c * f(x)^γ
应用场景:
过亮图像:选择 γ < 1,降低亮度并增加对比度。
过暗图像:选择 γ > 1,增加亮度并增加对比度。
对比度不足:选择 γ > 1 或 γ < 1,增强对比度。
直方图均衡化:
应用场景:解决图像对比度不足的问题,增强图像的整体对比度。
效果:通过重新分布图像的灰度级,使得图像的直方图更均匀,从而增加图像的对比度。

  • 23
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Next---YOLO

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值