ToB企服应用市场:ToB评测及商务社交产业平台

标题: opencv图像处理机器学习真实项目教程(python实现)2图像入门 [打印本页]

作者: 农民    时间: 2024-2-28 16:14
标题: opencv图像处理机器学习真实项目教程(python实现)2图像入门
本章介绍图像的基本概念和基本操作。 我们将首先提供像素等图像基础知识的清晰定义。 接下来,我们将深入讲解如何使用 OpenCV 库读取、显示和保存图像。 然后我们将继续使用 OpenCV 在图像上绘制形状的实际任务,重点是矩形、圆形和其他基本形状等主题。
主要内容:
2.1 图像和像素简介

什么是图像? 用非技术术语来说,图像是指场景、物体或人的视觉表示,它使我们能够更好地理解周围的世界。在数字环境中,图像是像素的多维阵列。
像素是图像的构建块。 像素是数字图像的最小单位,包含有关其颜色和位置的信息。 当多个像素在二维网格中聚集在一起时,它们就形成了完整的图像。 数字图像中的像素以网格图案排列以创建整体图像。 每个像素都包含特定的颜色信息,它们一起形成完整的图像。
像素通常用于表示灰度或彩色图像。 灰度图像通常表示为二维像素网格,而彩色图像通常表示为多维矩阵。 在灰度图像中,每个像素都分配有0 到 255 之间的值,表示该点图像的强度。 值 0 表示没有强度,导致黑色像素,而值255表示最大强度,导致纯白色像素。
在彩色图像中,每个像素由三个或四个值的组合表示,最常见的颜色空间是 RGB 颜色空间。 在此空间中,使用表示红色、绿色和蓝色通道强度的三个值来表示单个像素。 每个值的范围从 0 到 255,表示像素中存在的每种颜色的数量。 典型的 RGB 像素可以用(红、绿、蓝)格式表示。
例如,具有 (0,0,0) 值的颜色表示黑色,因为所有颜色的强度均为 0,而 (255,255,255) 表示白色图像,因为所有颜色都有最大值。
让我们看几个关于如何在 RGB 颜色空间中表示颜色的示例:
分辨率是一个术语,用于描述构成图像的像素总数。 分辨率越高,像素越多,从而产生更详细和高质量的图像。 分辨率通常以每英寸像素 (PPI) 或每英寸点数 (DPI) 来衡量。 当图像的分辨率较低时,意味着像素较少,因此图像的细节较少。
长宽比是指图像的宽度和高度之间的比例关系,它决定了图像的整体形状。 它通常表示为用冒号分隔的两个数字(例如 4:3 或 16:9),表示图像或屏幕的宽度和高度。 例如,纵横比为 4:3 的图像的宽度为每3 个单位的高度对应 4 个单位的长度。 宽高比用于确保在不同设备上显示图像时图像正确适合显示尺寸。
数字图像的像素数量一直在迅速增加。 第一台商用数码相机 Dycam Model 1 的分辨率仅为 0.01兆像素,而当今的高端相机可以捕获分辨率为 100兆像素或更高的图像。
2.2 加载和显示图像

是时候开始处理图像了! 在本书中,当我们引导您完成探索和操作图像的过程时,您将获得实践经验。 在我们继续前进时,请务必自行实现代码示例,因为这将有助于巩固您对我们将要介绍的概念的理解。
2.2.1 Imread()

要开始使用OpenCV处理图像,我们需要使用imread() 函数。通过该函数,我们可以将图像加载到我们的程序中:
  1. cv2.imread(path, flag=cv2.IMREAD_COLOR)
复制代码
参数:
  1. cv2.imread(path, 0)
复制代码
这将以灰度格式加载图像。
2.2.2 imshow
  1. cv2.imshow(winname, mat)
复制代码
参数:
2.2.3 imwrite

Imwrite 用于将图像保存到系统中。
  1. cv2.imwrite(filename, img, params=None)
复制代码
参数:
示例代码
在本练习中,我们将使用之前学习的代码加载图像并显示图像:
  1. import cv2
  2. # Using imread to read out image
  3. img = cv2.imread("../img/dog.jpg")
  4. # Print the shape of the image
  5. print(img.shape)
  6. # Displaying the image
  7. cv2.imshow("Dog Image", img)
  8. # Wait until a key is pressed
  9. cv2.waitKey(0)
  10. # Close all Windows
  11. cv2.destroyAllWindows()
复制代码

2.2.3 WaitKey

WaitKey是OpenCV程序中的一个函数,用于让用户在特定时间内或按下某个键之前显示一个窗口。如果没有 waitKey,图像或视频会在用户来得及观看之前立即关闭。
它只接受一个整数参数,即窗口保持打开的毫秒数。如果给定的参数为0或根本没有给定参数,函数将等待按键按下后再关闭窗口。
2.2.3 DestroyAllWindows

DestroyAllWindows是一条简单的命令,用于关闭OpenCV在执行代码期间打开的所有窗口。该命令不需要任何参数。
我们已经成功运行了第一段 OpenCV 代码,现在可以读取并显示图像了。
试试看 现在尝试以不同的路径将前面的图像写入光盘。
2.3 用像素操作图像

图像在 Python 中存储为 NumPy 数组,这意味着图像元素可以像 NumPy 数组一样被索引。通过图像索引,我们可以操作图像中的单个像素或某个像素区域。
2.3.1 访问单个像素

要访问图像中的某个像素,我们可以使用类似的 img[row, col] 索引。使用此方法访问像素值将返回一个包含像素值的 NumPy 数组:
  1. import cv2
  2. # Load an image in grayscale mode
  3. img = cv2.imread('../img/dog.jpg')
  4. # Get the pixel value at x=75, y=25
  5. pixel_value = img[25, 75]
  6. #Print this value
  7. print(pixel_value)
  8. #Manipulate value of this pixel
  9. img[25, 75] = 0
  10. #Rechecking value
  11. print(pixel_value)
复制代码
结果:
  1. [120 165 222]
  2. [0 0 0]
复制代码
对于RGB图像,前面的代码行将返回包含三个值的数组,而对于灰度图像,它将只返回值,例如30。
我们还可以使用索引修改像素值。我们可以为某个像素赋值,如下所示:
  1. img[5,7] = 255
复制代码
如果img是灰度图像,这将为像素赋值255。如果图像img是BGR 格式,那么三个颜色通道的值都将设置为 255。
如果我们想在 RGB 图像中设置特定值,可以使用该特定颜色的颜色代码:
  1. img[5,7] = [0,255,0]
复制代码
这将把绿色通道值设置为 255,其他两个通道设置为 0,从而得到纯绿色像素。
2.3.2 访问感兴趣区域 (ROI Region of Interest)

现在,我们将讨论如何通过使用索引定义感兴趣区域 (ROI) 来操作图像的整个区域。我们经常需要操作图像的特定区域,而不是单个像素或整个图像。
  1. import cv2
  2. # Load image
  3. img = cv2.imread('../img/dog.jpg')
  4. # Define index values
  5. x=50
  6. y=60
  7. w=75
  8. h=75
  9. # Extract ROI from the image
  10. roi = img[y:y+h,x:x+w]
  11. # Print shape of the extracted ROI
  12. print(roi.shape)
  13. # Assigning a colour to a different ROI
  14. img[100:150,150:200] = (255,255,0)
  15. cv2.imshow('Extracted ROI rectangle', roi)
  16. cv2.imshow('Image with ROI colour', img)
  17. cv2.waitKey(0)
  18. cv2.destroyAllWindows()
复制代码

2.4 在OpenCV中绘图

在本节中,我们将学习如何使用 OpenCV 绘制形状。我们可以使用 OpenCV 设计各种形状,包括线、圆、矩形和多边形,还可以自定义它们的大小和颜色。使用 OpenCV 还可以在照片上添加文字。形状有多种用途,包括注释照片和强调照片的特定区域。
首先,我们将创建一张空白画布,在上面绘制各种形状。或者,也可以加载一张图片,然后在上面绘制形状。
为了创建绘制形状的画布,我们可以使用 NumPy 创建一个 NumPy 数组。然后,我们可以使用各种方法在 NumPy 画布上绘图:
  1. canvas = np.zeros((600, 600, 3), dtype=np.uint8)
复制代码
我们使用 np.zeros 函数创建画布。这是一个 NumPy 函数,用于创建一个具有特定形状和数据类型的 NumPy 数组。在本例中,我们创建了一个具有 "np.uint8 "数据类型的形状数组(600,600,3)。该数据类型对应于 8 位无符号整数,取值范围为 0 至 255。
2.4.1 线条(Line)

我们使用 cv2.line 命令在图像上创建线条。该命令提供多个参数,让我们可以自定义线条,以满足我们的特定需求和要求。
参数:
  1. cv2.line(img, pt1, pt2, color, thickness=1, lineType = cv2.LINE_8, shift = 0)
复制代码
实例:
  1. import numpy as np
  2. import cv2
  3. # Create a black canvas
  4. canvas = np.zeros((600, 500, 3), dtype=np.uint8)
  5. # Define the vertices of the triangle
  6. p1 = (250, 100)
  7. p2 = (100, 400)
  8. p3 = (400, 400)
  9. # Draw the lines using cv2.line()
  10. cv2.line(canvas, p1, p2, (0, 255, 0), 1)
  11. cv2.line(canvas, p3, p1, (255, 0, 0), 3)
  12. cv2.line(canvas, p2, p3, (255, 255, 255), 10)
  13. # Display the image
  14. cv2.imshow("Triangle", canvas)
  15. cv2.waitKey(0)
  16. cv2.destroyAllWindows()
复制代码

参考资料

2.4.2 矩形(rectangle)

在 OpenCV 中,绘制矩形与绘制直线类似。我们可以使用 cv2.rectangle 命令在 OpenCV 中创建矩形:
  1. Cv2.rectangle(img, pt1, pt2, color, thickness=1, lineType=cv2.LINE_8, shift=0)
复制代码
参数:
  1. import numpy as np
  2. import cv2
  3. # Create a black image
  4. img = np.zeros((600, 500, 3), dtype=np.uint8)
  5. # Draw the figure using rectangles and lines
  6. # Face
  7. cv2.rectangle(img, (150, 150), (350, 400), (242, 199, 155), thickness=-1)  
  8. # Cap
  9. cv2.rectangle(img, (100, 50), (400, 150), (198, 131, 56), thickness=-1)
  10. # Mouth
  11. cv2.rectangle(img, (200, 310), (300, 330), (128, 0, 128), thickness=2)
  12. # Draw the eyes on the face as X shapes
  13. cv2.line(img, (195, 200), (212, 228), (0, 0, 0), thickness=2)
  14. cv2.line(img, (212, 200), (195, 228), (0, 0, 0), thickness=2)
  15. cv2.line(img, (288, 200), (305, 228), (0, 0, 0), thickness=2)
  16. cv2.line(img, (305, 200), (288, 228), (0, 0, 0), thickness=2)
  17. # Display the image
  18. cv2.imshow('Robo', img)
  19. cv2.waitKey(0)
  20. cv2.destroyAllWindows()
复制代码

2.4.3 circle

cv2.circle() 函数用于在图像上绘制圆形:
  1. cv2.circle(img, center, radius, color, thickness=1, lineType = cv2.LINE_8, shift=0)
复制代码
参数
  1. import numpy as np
  2. import cv2
  3. # Create an empty canvas
  4. canvas = np.zeros((500, 500, 3), dtype=np.uint8)
  5. # Define the center point
  6. center = (250, 250)
  7. # Define the radii of the circles
  8. radius1 = 50
  9. radius2 = 100
  10. radius3 = 150
  11. # Define the colors of the circles
  12. color1 = (0, 0, 255)
  13. color2 = (255, 0, 0)
  14. color3 = (0, 255, 0)
  15. # Define the thickness of the circles
  16. thickness1 = -1
  17. thickness2 = 2
  18. thickness3 = 10
  19. # Draw the circles on the canvas
  20. cv2.circle(canvas, center, radius1, color1, thickness1)
  21. cv2.circle(canvas, center, radius2, color2, thickness2)
  22. cv2.circle(canvas, center, radius3, color3, thickness3)
  23. # Display the image
  24. cv2.imshow("Image", canvas)
  25. cv2.waitKey(0)
  26. cv2.destroyAllWindows()
复制代码

2.4.4 文本(Text)

我们使用函数 cv2.putText() 为图像添加文本:
  1. cv2.putText(img, text, org, fontFace=’cv2.FONT_HERSHEY_SIMPLEX’, fontScale=0, color=(0,0,0), thickness=1, lineType=’cv2.LINE_AA’, bottomLeftOrigin=False)
复制代码
参数:
  1. import numpy as np
  2. import cv2
  3. # create a blank image
  4. img = np.zeros((600, 500, 3), dtype=np.uint8)
  5. # define the text to be displayed
  6. text = "Hello World!"
  7. # set the text color and position
  8. color = (255, 0, 0)
  9. pos = (50, 200)
  10. # display the text using cv2.putText()
  11. cv2.putText(img, text, pos, cv2.FONT_HERSHEY_SIMPLEX, 2, color, 3)
  12. cv2.imshow("Image with text", img)
  13. cv2.waitKey(0)
  14. cv2.destroyAllWindows()
复制代码

2.5 总结

本章扎实地介绍了图像的基本概念和基本操作。我们定义了像素等关键概念,并讲解了如何使用 OpenCV 库读取、显示和保存图像。此外,我们还探讨了在图像上绘制形状的实际任务,重点是矩形和圆形等基本形状。这一基础对于将来构建更复杂的图像处理应用程序非常宝贵。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4