图像处理基础+代码演示---Python

本文详细介绍了计算机如何理解图像,从二值图像的简单黑白表示到灰度图像的亮度信息,再到彩色图像的红绿蓝通道。讲解了不同颜色空间的应用,如RGB、HSV和Lab,并展示了图像处理中的基本操作,如像素值转换和颜色空间转换。
摘要由CSDN通过智能技术生成

1.1计算机眼中的图像---计算机对图像进行理解和处理的方式。

 通常来说,计算机眼中的图像是以数字形式存在的,可以由像素点的阵列表示。计算机使用这些数字化的图像数据来进行各种图像处理和分析任务。

 在计算机眼中,图像通常被表示为一个由像素构成的矩阵或张量,其中每个像素包含了图像的颜色和亮度信息。这些像素可以被进一步分类和处理,以进行特征提取、模式识别、目标检测、图像分割等任务。

1.2图像的基本表示方法

1.2.1二值图像

 字母A的图像 ---------> 计算机内字母A的存储形式                                          

          


    每个像素只有两种可能的取值。典型的二值图像是以黑白形式呈现,其中每个像素要么是黑色(通常表示为0),要么是白色(通常表示为1)。这种图像类型非常适合用于图像分割和简单形状的检测。通常情况下,生成二值图像是通过对原始图像进行阈值处理来实现的,超过某个阈值的像素被设置为白色,低于阈值的像素被设置为黑色。二值图像通常用来表示简单的形状、轮廓或者执行一些特定的图像处理任务,比如边缘检测、文本识别、或者一些机器学习应用中的特征提取。在某些情况下,二值图像还可以表示逻辑信息,例如掩模、蒙版或者一些二元数据。

注:掩模,蒙版,二元数据在图像处理和计算机视觉中经常出现,它们对于控制图像处理的行为、提取图像特定区域的特征,以及一些特定任务的执行非常有用。

1. 掩模(Mask):在图像处理中,掩模是一个与原始图像相同大小的矩阵,其中的元素值通常为0或1。掩模通常用于指定对图像特定区域的操作,比如过滤、增强或者遮罩。在这种情况下,掩模中的1对应原始图像中需要操作的区域,而0则对应其他区域。

2. 蒙版(Masking):在图像处理和计算机视觉中,蒙版通常是指一个用于隐藏或者显示图像特定区域的生成图像。蒙版可以与原始图像叠加,通过蒙版中设定的像素值,控制哪些部分的原始图像应该被隐藏或者应该保留。

3. 二元数据:二元数据通常用来表示一些二元状态或者二进制信息。在图像处理中,它通常用于表示特定像素的开关状态,比如检测、存在、缺失、或者深度信息等。这类数据可以用于标记图像中的特定区域,执行一些二值化操作或者控制某些图像处理算法的行为。


代码示例:

import cv2
import numpy as np
# 创建一个大小为100x100的纯黑色图像
binary_image = np.ones((100, 100), dtype=np.uint8) * 0
# 保存图像
cv2.imwrite('binary_image.png', binary_image)

结果展示:                                            


1.2.2灰度图像

lena的灰度图像


每个像素的灰度值代表了图像中的亮度信息。与彩色图像不同,灰度图像中的每个像素只有一个通道,代表了不同程度的灰度。通常情况下,计算机会将灰度处理为256个灰度级,灰度值范围在[0,255](0(黑色)到255(白色)之间)。

   用于表示256个灰度级的数值0~255,正好可以用一个字节(8位二进制)来表示。


例如下表中部分灰度级所对应的值。


--lena灰度图部分区域数值形式表示->


在有些情况下,也会使用8位二进制来表示一幅二值图像,在这种情况下,使用灰度值255表示白色,灰度值0表示黑色,此时,该二值图像内仅仅有数值0和数值255两种类型的灰度值(灰度级),不存在其他灰度级的像素点。


灰度图像常用于许多图像处理任务中,包括图像增强、特征提取、边缘检测等。由于灰度图像的颜色信息相对较少,因此在一些情况下,对灰度图像的处理和分析可以更加方便和高效。在某些应用中,灰度图像也用于表示传感器数据或者图像处理算法中的中间结果。另外,许多图像处理算法通常会首先将输入的彩色图像转换为灰度图像,以减少计算量或者更加关注图像的结构和纹理特征。


代码演示:

import cv2
import numpy as np
# 创建一个大小为100x100的灰度图像
gray_image = np.ones((100, 100), dtype=np.uint8) * 128  # 创建一个灰度图,所有像素的值均为128
# 保存图像
cv2.imwrite('gray_image.png', gray_image)
# 显示图像
cv2.imshow('Gray Image', gray_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

结果展示:

                                                    


1.2.3彩色图像

彩色图像在很多领域中都有广泛的应用,是计算机视觉和图像处理中的重要组成部分。

彩色图像是一种由红色(R)、绿色(G)和蓝色(B)三个颜色通道组成的图像,每个像素包含了这三个颜色通道的信息。每个通道的取值通常在0到255之间,并且不同通道的取值组合形成了图像中每个像素的颜色。因此,彩色图像中的每个像素可以呈现出许多不同的颜色。


不同的RGN值所对应的颜色


对于下图这幅彩色图像,可以理解为由R通道,G通道,B通道三个通道构成。其中,每个通道可以理解为一个独立的灰度图像。在下面这幅彩色图像里被框出来的区域对应三个通道的三个矩阵,它的RGB值为(205,89,68)。

对于计算机来说,彩色图像通常以RGB格式进行表示,其中每个像素用三个值来描述其在红、绿、蓝通道上的颜色分量。在R->G->B,即第一个通道是R通道,第二个通道是G通道,第三个通道是B通道,但是需要注意的是,在OpenCv中,通道顺序是B->G->R,所以在图像处理过程中,可以根据需要,对图像的通道顺序进行交换,除此之外,还可以根据需要对不同色彩空间的图像进行类型转换。


1.颜色空间的转换代码示例:

import cv2

# 读取图像
image_path = "dongman.jpg"
original_image = cv2.imread(image_path)

if original_image is not None:
    print("成功读取图像")
else:
    print("无法读取图像")

# 将图像从BGR转换为RGB
rgb_image = cv2.cvtColor(original_image, cv2.COLOR_BGR2RGB)
# 将图像从BGR转换为HSV
hsv_image = cv2.cvtColor(original_image, cv2.COLOR_BGR2HSV)
# 将图像从BGR转换为LAB
lab_image = cv2.cvtColor(original_image, cv2.COLOR_BGR2LAB)


# 创建带标签的图像
labeled_original = cv2.putText(original_image.copy(), 'Original BGR Image', (30, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 0), 2, cv2.LINE_AA)
labeled_rgb = cv2.putText(cv2.cvtColor(rgb_image, cv2.COLOR_RGB2BGR), 'RGB Image', (30, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 0), 2, cv2.LINE_AA)
labeled_hsv = cv2.putText(cv2.cvtColor(rgb_image, cv2.COLOR_HSV2BGR), 'HSV Image', (30, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (31, 255, 255), 2, cv2.LINE_AA)
labeled_lab = cv2.putText(cv2.cvtColor(rgb_image, cv2.COLOR_LAB2BGR), 'LAB Image', (30, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 0), 2, cv2.LINE_AA)

# 显示图像
cv2.namedWindow('Color Space Transformations', cv2.WINDOW_NORMAL)
cv2.imshow('Color Space Transformations', cv2.vconcat([cv2.hconcat([labeled_original, labeled_rgb, labeled_hsv, labeled_lab])]))
cv2.waitKey(0)
cv2.destroyAllWindows()

结果图展示:


2.对不同色彩空间的图像进行类型转换。

不同色彩空间的类型转换代码示例:

import cv2

# 读取彩色图像
color_image_path = "dongman.jpg"
color_image = cv2.imread(color_image_path)

# 将彩色图像转换为灰度图像
gray_image = cv2.cvtColor(color_image, cv2.COLOR_BGR2GRAY)

# 将灰度图像转换为二值图像
ret, binary_image = cv2.threshold(gray_image, 127, 255, cv2.THRESH_BINARY)

# 添加标签到图像
labeled_color_image = cv2.putText(color_image.copy(), 'Original Image', (30, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 255), 2, cv2.LINE_AA)
labeled_gray_image = cv2.putText(cv2.cvtColor(gray_image, cv2.COLOR_GRAY2BGR), 'Gray Image', (30, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 255), 2, cv2.LINE_AA)
labeled_binary_image = cv2.putText(cv2.cvtColor(binary_image, cv2.COLOR_GRAY2BGR), 'Binary Image', (30, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 255), 2, cv2.LINE_AA)

# 调整图像大小,确保它们具有相同的尺寸
labeled_color_image = cv2.resize(labeled_color_image, (400, 400))
labeled_gray_image = cv2.resize(labeled_gray_image, (400, 400))
labeled_binary_image = cv2.resize(labeled_binary_image, (400, 400))

# 创建窗口并显示图像
combined_image = cv2.hconcat([labeled_color_image, labeled_gray_image, labeled_binary_image])
cv2.imshow('Image Transformations', combined_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

结果图显示:


另外,还有其他彩色空间(如HSV、LAB等)用于表示彩色图像,每种表示方法都有其特定的应用场景。

'''
颜色通道:
在彩色图像中,通常使用的颜色通道是红色(Red)、绿色(Green)和蓝色(Blue),简称 RGB。
在一些情况下,为了表达颜色,可能还会使用其他的颜色空间,
比如 HSV(色相、饱和度、明度)或者 Lab 等。

# RGB 颜色通道
- **红色通道(R)**:红色通道表示了图像中红色的分量。
在 RGB 表示中,如果只有红色通道有数值,那么图像会只显示红色的分量。
- **绿色通道(G)**:绿色通道表示了图像中绿色的分量。
与红色通道类似,如果只有绿色通道有数值,那么图像会只显示绿色的分量。
- **蓝色通道(B)**:蓝色通道表示了图像中蓝色的分量。
如果只有蓝色通道有数值,那么图像会只显示蓝色的分量。

# HSV 颜色通道
- **色相(Hue)**:表示颜色的属性,是一个从 0 到 360 的角度值(有时也会映射到 0 到 180),
对应于颜色的不同种类。
例如,红色在 0 度或 360 度,绿色在 120 度,蓝色在 240 度。
- **饱和度(Saturation)**:表示颜色的鲜艳程度或纯度。
0% 表示灰度色,100% 表示完全鲜艳的颜色。
- **明度(Value)**:表示颜色的亮度。
0% 代表黑色,100% 代表最大亮度。

#LAB 颜色通道
LAB颜色空间与常见的RGB(红、绿、蓝)和CMYK(青、品红、黄、黑)等颜色空间不同,
它不是基于彩色的原始成分,而是基于颜色的感知属性。

LAB颜色空间由三个分量组成:
- L 表示亮度(Luminance),用来表示像素的亮度和暗度,L的取值范围通常是0到100。
- A 表示色度(a channel),从绿色到红色的范围;负值表示绿色,正值表示红色。
- B 表示色度(b channel),从蓝色到黄色的范围;负值表示蓝色,正值表示黄色。

LAB颜色空间的优点之一是它对人类视觉系统的颜色感知进行了较好的模拟,
因此在图像处理和计算机视觉任务中具有广泛的应用。
与RGB颜色空间相比,LAB颜色空间更适合用于颜色分割、颜色边缘检测和颜色校正等任务。
由于不受光照和白平衡变化的影响,LAB颜色空间在许多计算机视觉应用中被广泛采用。
'''

代码演示:

import cv2
import numpy as np

# 创建一个大小为100x100的HSV图像(纯蓝色)
hsv_image = np.zeros((100, 100, 3), dtype=np.uint8)
hsv_image[:, :, 0] = 120  # 设置色调为120(蓝色)
hsv_image[:, :, 1] = 255  # 设置饱和度为255
hsv_image[:, :, 2] = 255  # 设置亮度为255

# 转换为BGR格式以便保存
hsv_bgr = cv2.cvtColor(hsv_image, cv2.COLOR_HSV2BGR)

# 保存HSV图像
cv2.imwrite('hsv_image.png', hsv_bgr)

# 创建一个大小为100x100的RGB图像(纯绿色)
rgb_image = np.zeros((100, 100, 3), dtype=np.uint8)
rgb_image[:, :, 1] = 255  # 设置绿色通道为255

# 保存RGB图像
cv2.imwrite('rgb_image.png', rgb_image)

# 创建一个大小为100x100的Lab图像(灰色)
lab_image = np.zeros((100, 100, 3), dtype=np.uint8)
lab_image[:, :, 0] = 128  # 设置L通道为128
lab_image[:, :, 1] = 128  # 设置a通道为128
lab_image[:, :, 2] = 128  # 设置b通道为128

# 转换为BGR格式以便保存
lab_bgr = cv2.cvtColor(lab_image, cv2.COLOR_LAB2BGR)

# 保存LAB图像
cv2.imwrite('lab_image.png', lab_bgr)

结果展示:

      


彩色图像通常用于表示真实世界中的场景,比如自然风景、人物肖像、艺术作品等。在计算机视觉和图像处理中,彩色图像的处理通常需要考虑到不同通道之间的相互影响。同时,对彩色图像进行分割、特征提取以及对象识别也是计算机视觉中的重要任务。

  • 15
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
K-Means聚类算法是一种无监督学习的方法,通过将数据分为不同的聚类来进行数据集的归纳和总结。在图像处理中,K-Means聚类可以用来将图像分成不同的颜色区域,实现图像分割的目的。 下面是一个使用Python进行图像K-Means聚类的示例代码: ```python import numpy as np import cv2 # 读取图像 img = cv2.imread('image.jpg') # 转换为一维的数组 data = img.reshape((-1, 3)) # 将数据转换为 float 类型 data = np.float32(data) # 设置聚类的数量 k = 5 # 定义停止条件 criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0) # 运行 K-Means 算法 ret, label, center = cv2.kmeans(data, k, None, criteria, 10, cv2.KMEANS_RANDOM_CENTERS) # 将数据转换回图像矩阵 center = np.uint8(center) res = center[label.flatten()] res2 = res.reshape((img.shape)) # 显示结果 cv2.imshow('res2', res2) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在这个示例中,我们首先使用OpenCV库读取一张图像,然后将其转换为一维的数组。接着,我们将数据转换为float类型,并设置聚类的数量为5。我们还定义了停止条件,这里设置为最多迭代10次,或者误差小于1.0。最后,我们使用cv2.kmeans函数运行K-Means算法,并将结果转换回图像矩阵,最终显示聚类结果。 需要注意的是,该示例只是一个简单的演示,实际运用中可能需要对图像进行预处理、调整参数等操作,以达到最佳的聚类效果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值