【Opencv-Python】数字图像处理(二)——空域图像处理(一)


>>文章导航

1 实验目的和要求

2 实验环境与配置

3 实验内容及实验结果

3.1 灰度变换

3.1.1 灰度图像二值化

3.1.2 图像反转

3.1.3 对数变换

(1) 尝试不同的尺度比例常数 c 值(上面程序令 c=42),比较和分析所得图像有何差别。

(2) 自己找一幅整体偏暗的图像 (自己拍的也行) ,看看通过对数变换可否提升图像对比度和细节的清晰度。

3.2 图像运算

3.2.1 图像加法

思考:观察效果整体是偏亮还是偏暗,并分析原因。

3.2.2 图像减法

思考:

1. 观察效果整体是偏亮还是偏暗,并分析原因。

2. 分别尝试“图像 1 减图像 2 ”、“图像 2 减图像 1”,比较两种情况的减法效果有何不同。

3.2.3 图像融合

(1) 尝试不同的 alpha, beta 值,观察并描述输出图像的效果有何不同。注意 alpha 与 与 beta为 之和为 1。

(2) 尝试不同的 gamma 值,观察并描述输出图像的效果有何不同。

3.3 直方图修正

3.3.1 直方图均衡化

*3.3.2 直方图规定化

4 实验心得与思考

4.1 实验心得总结

4.2 实验问题与解决


1 实验目的和要求

(1)掌握图像处理的基本概念和灰度变换的方法;

(2)理解并掌握灰度图像二值化、图像反转、对数变换等处理方法;

(3)了解并掌握图像运算的基本概念和方法,包括图像加法、减法、融合等;

(4)通过实验,提高对图像处理基本概念的理解,培养实际操作和解决问题的能力。

2 实验环境与配置

(1)计算机;

(2)Python及Anaconda软件;

(3)典型的灰度、彩色图像等文件。

3 实验内容及实验结果

3.1 灰度变换

3.1.1 灰度图像二值化

cv2.threshold(img, threshold, maxval, type)


img 就是图片,threshold 即为阈值,maxval 为当灰度值大于(或小于)阈值时将该灰度值
赋成的值,type 规定的是当前二值化的方式。

import cv2
# 读取图像
mg_input = cv2.imread(r'D:\images\cameraman.tif', cv2.IMREAD_GRAYSCALE)
# 二值化
ret, im_binary = cv2.threshold(mg_input, 80, 255, cv2.THRESH_BINARY)
# 显示图像
cv2.imshow('input Image', mg_input)
cv2.imshow('output Image', im_binary)
cv2.waitKey(0)
cv2.destroyAllWindows()

3.1.2 图像反转

        适用于增强嵌入在一幅图像暗区域中的白色或灰色细节。变换公式为:s=L-1-r 。

img = cv2.imread(r'.\images\lena_gray_256.tif')        # 前头加 r 是消除反斜杠转义
reverse_img = 255 -img

import cv2
img = cv2.imread(r'D:\images\lena_gray_256.tif')    # 前头加 r 是消除反斜杠转义
reverse_img = 255 - img
# 显示图像
cv2.imshow('input Image', img)
cv2.imshow('output Image', reverse_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

3.1.3 对数变换

        对数变换可以拉伸范围较窄的低灰度值,同时压缩范围较宽的高灰度值。可以用来扩展
图像中的暗像素值,同时压缩亮像素值。

        变换公式为:s=clog(1+r) 。

(1) 尝试不同的尺度比例常数 c 值(上面程序令 c=42),比较和分析所得图像有何差别。

        c=42:

import cv2
import numpy as np
img_input = cv2.imread(r'D:\images\pollens.tif')
img_output = 42*np.log(1.0 + img_input)
img_output = np.uint8(img_output + 0.5)
# 显示图像
cv2.imshow('input Image', img_input)
cv2.imshow('output Image', img_output)
cv2.waitKey(0)
cv2.destroyAllWindows()

        c=12:

import cv2
import numpy as np
img_input = cv2.imread(r'D:\images\pollens.tif')
img_output = 12*np.log(1.0 + img_input)
img_output = np.uint8(img_output + 0.5)
# 显示图像
cv2.imshow('output Image', img_output)
cv2.waitKey(0)
cv2.destroyAllWindows()

        c=1: 

import cv2
import numpy as np
img_input = cv2.imread(r'D:\images\pollens.tif')
img_output = 1*np.log(1.0 + img_input)
img_output = np.uint8(img_output + 0.5)
# 显示图像
cv2.imshow('output Image', img_output)
cv2.waitKey(0)
cv2.destroyAllWindows()

c 越大,图像越亮;

(2) 自己找一幅整体偏暗的图像 (自己拍的也行) ,看看通过对数变换可否提升图像对比度和细节的清晰度。
import cv2
import numpy as np
img_input = cv2.imread(r'D:\myimages\mountain.jpg')
img_output = 24*np.log(1.0 + img_input)
img_output = np.uint8(img_output + 0.5)
# 显示图像
cv2.imshow('input Image', img_input)
cv2.imshow('output Image', img_output)
cv2.waitKey(0)
cv2.destroyAllWindows()

3.2 图像运算

3.2.1 图像加法

   目标图像 = cv2.add(图像 1, 图像 2) 。

   结果是饱和运算,即:
(1)当目标像素值<= 255 时,结果为“图像 1+图像 2”,例如:120+48=168
(2)当目标像素值> 255 时,结果为 255,例如:(251+64) = 255

import cv2
src1 = cv2.imread('D:\images\lena_gray_256.tif')
src2 = cv2.imread('D:\images\cameraman_256.tif')
result = cv2.add(src1,src2)
# 显示图像
cv2.imshow('src1', src1)
cv2.imshow('src2', src2)
cv2.imshow('result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

思考:观察效果整体是偏亮还是偏暗,并分析原因。

图像加法的输出图像整体偏亮, 两个输入图像的像素值都相对较高,输出图像的对应像素值就可能超过255,导致像素值溢出。

3.2.2 图像减法

result = cv2.subtract(图像 1, 图像 2)       # 两个图像相减

import cv2
src1 = cv2.imread('D:\images\lena_gray_256.tif')
src2 = cv2.imread('D:\images\cameraman_256.tif')
result = cv2.subtract(src1,src2)
# 显示图像
cv2.imshow('src1', src1)
cv2.imshow('src2', src2)
cv2.imshow('result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

“图像 1 减图像 2 ”:

思考:
1. 观察效果整体是偏亮还是偏暗,并分析原因。

图像减法输出图像整体偏暗,两个图像的像素值的差值较大,它们的差值就会小于0,导致像素值溢出, 使输出图像的亮度降低,因为像素值的减小会使图像变得更暗。

2. 分别尝试“图像 1 减图像 2 ”、“图像 2 减图像 1”,比较两种情况的减法效果有何不同。

“图像 2 减图像 1 ”:

import cv2
src1 = cv2.imread('D:\images\lena_gray_256.tif')
src2 = cv2.imread('D:\images\cameraman_256.tif')
result = cv2.subtract(src2,src1)
# 显示图像
cv2.imshow('src1', src1)
cv2.imshow('src2', src2)
cv2.imshow('result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

“图像 1 减图像 2 ” 比 “图像 2 减图像 1” 更亮;

3.2.3 图像融合

图像融合:目标图像 = 图像 1 *系数 1 + 图像 2*系数 2 + 亮度调节量


dst = cv2.addWeighted(scr1, alpha, src2, beta, gamma)


dst = src1*alpha + src2*beta + gamma       # 也可自行编写融合公式

(1) 尝试不同的 alpha, beta 值,观察并描述输出图像的效果有何不同。注意 alpha 与 与 beta
为 之和为 1。
import cv2
src1 = cv2.imread(r'D:\images\lena_color_512.tif')
src2 = cv2.imread(r'D:\images\peppers_color.tif')
result = cv2.addWeighted(src1, 0.6, src2, 0.4, 0)
# 显示图像
cv2.imshow('src1', src1)
cv2.imshow('src2', src2)
cv2.imshow('result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

(2) 尝试不同的 gamma 值,观察并描述输出图像的效果有何不同。

gamma = 50 的输出图像比 gamma = 5 的输出图像更亮。

亮度调节量 gamma 可以用来控制输出图像的整体亮度。通过改变 gamma 的值,可以调整输出图像的亮度。如果 gamma 大于 1,那么输出图像会变亮;如果 gamma 小于 1,那么输出图像会变暗。

3.3 直方图修正

3.3.1 直方图均衡化

        直方图均衡化 (Histogram Equalization) 就是把一个已知灰度概率密度分布的图像经过一种变换,使之演变为一幅具有均匀灰度概率密度分布的新图像。

   dst=cv2.equalizeHist(src)

         分别找一幅 过暗、 过亮、 低对比度的图像进行直方图归一化 , 观察并描述这三种图像归一化后的效果特点,并指出:直方图归一化是不是对这三种图像都有很好的改善效果。

img = cv2.imread(r'D:\myimages\sea.jfif', cv2.IMREAD_GRAYSCALE)
equ = cv2.equalizeHist(img)# 显示图像
cv2.imshow('src1', img)
cv2.imshow('result', equ)
cv2.waitKey(0)cv2.destroyAllWindows()

过暗的图像:

img = cv2.imread(r'D:\myimages\sun.jpg', cv2.IMREAD_GRAYSCALE)
equ = cv2.equalizeHist(img)
# 显示图像
cv2.imshow('src', img)
cv2.imshow('result', equ)
cv2.waitKey(0)
cv2.destroyAllWindows()

 过亮的图像:

img = cv2.imread(r'D:\myimages\horses.png', cv2.IMREAD_GRAYSCALE)
equ = cv2.equalizeHist(img)
# 显示图像
cv2.imshow('src', img)
cv2.imshow('result', equ)
cv2.waitKey(0)
cv2.destroyAllWindows()

 低对比度的图像:

        并不是所有的图像经过直方图均衡化后都会有好的改善效果,这主要取决于图像的原始质量和所应用的具体领域。

        对于过暗的图像,直方图均衡化可能无法提供明显的改善。过暗的图像通常具有较低的对比度和较高的亮度,因此,通过增加所有像素的亮度来提高对比度的直方图均衡化方法可能无法有效地增强过暗图像的细节和对比度。

        对于过亮的图像,直方图均衡化可能会有一定的改善效果。过亮的图像通常具有较高的对比度和较低的亮度,因此,通过降低一些像素的亮度来提高对比度的直方图均衡化方法可能会帮助减少过亮区域中的过度曝光,并增强图像的细节。

        对于低对比度的图像,直方图均衡化通常会有很好的改善效果。低对比度的图像通常具有平坦的灰度级分布,使得图像中的细节难以区分。通过扩展灰度级范围并重新分配像素值的直方图均衡化方法可以增强图像中的对比度,使图像更清晰、更易于阅读和理解。

*3.3.2 直方图规定化

4 实验心得与思考

4.1 实验心得总结

        相较于第一次实验,我对图像处理和Python的操作和实验更熟悉了,没有第一次实验时懵圈的感觉。通过完成图像加法、减法、融合等操作,我深入了解了图像处理的基本概念和灰度变换的方法。在实验过程中,我尝试了不同的阈值和类型参数进行二值化处理,观察了所得二值化图像的不同效果。此外,我还通过图像反转和对数变换等方法,增强了图像的细节和对比度。

        在实验过程中,我意识到图像处理是一门非常有趣的学科,通过实验,我提高了自己对图像处理算法的理解和编程能力,也发现了自己在实验过程中存在的不足之处。这次实验让我对图像处理有了更深入的了解,也让我对这门学科产生了更浓厚的兴趣。我相信,在未来的学习中,我会继续努力探索和学习图像处理的相关知识和技术,不断提高自己的技能和能力。

4.2 实验问题与解决

        在实验中遇到预想之外的问题(比如得到的图像处理效果与预期不同),自己找到原因,并想到办法加以解决。

(1)未导入cv2包;


  如果觉得作者写得还不错的话, 点赞 / 收藏 / 评论 / 转发 四连支持一下吧~😘

最重要的是点一个大大的关注, 你的支持就是作者创作的最大动力!!!❤


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值