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

标题: python图像处理 [打印本页]

作者: 十念    时间: 2024-12-16 21:24
标题: python图像处理
一、图像透视变化

1.1 实验原理

        图像透视变换(Perspective Transformation)是一种通过数学方法将图像中的点集映射到一个新的点集上的技能。它能够对图像举行几何变换,常用于将不规则形状的区域转换为规则形状,或修正图像中的透视失真。
        透视变换的焦点在于透视矩阵的计算。通过一组源图像中的四个点(通常是矩形的四个角)和目标图像中的四个点,我们可以得到一个透视变换矩阵,然后应用该矩阵到原始图像中,从而得到变换后的图像。

1.2 实验代码 

  1. # 导入OpenCV库和numpy库
  2. import cv2
  3. import numpy as np
  4. # 从指定路径读取图像
  5. img = cv2.imread('./youhua.png')
  6. # 定义原始图像中的四个点(通常是矩形顶点),这些点用于定义要进行透视变换的区域
  7. # 这些点的坐标需要根据你的图像中的实际位置进行调整
  8. points1 = np.float32([[175,142],[621,35],[89,491],[652,546]])
  9. # 定义变换后的目标图像中的四个点,这里创建了一个新的矩形,其顶点位于
  10. # 原始图像的最左、最上、最右、最下边界上,从而进行透视变换
  11. # 这一步的目的是将原始图像中的不规则四边形区域变换为一个规则的矩形
  12. points2 = np.float32([[min(points1[:,0]),min(points1[:,1])],  # 左上角
  13.                       [max(points1[:,0]),min(points1[:,1])],  # 右上角
  14.                       [min(points1[:,0]),max(points1[:,1])],  # 左下角
  15.                       [max(points1[:,0]),max(points1[:,1])]   # 右下角
  16.                       ])
  17. # 使用cv2.getPerspectiveTransform函数计算透视变换矩阵M
  18. # 这个矩阵用于将points1中的点映射到points2中的点
  19. M = cv2.getPerspectiveTransform(points1,points2)
  20. # 使用cv2.warpPerspective函数应用透视变换矩阵M到原始图像img上
  21. # 第三个参数是输出图像的尺寸,这里设置为原始图像的尺寸
  22. img_output = cv2.warpPerspective(img,M,(img.shape[1],img.shape[0]))
  23. # 显示原始图像和变换后的图像
  24. cv2.imshow('img',img)
  25. cv2.imshow('img_output',img_output)
  26. # 等待用户按键操作,按任意键后关闭所有窗口
  27. cv2.waitKey(0)
复制代码
 
1.3 实验征象

二、 图片添加水印

2.1 实验原理

        图像叠加和 logo 融合是图像处理中常见的操纵。它通常用于将一个图像(如 logo)插入到另一张图像(如配景图)中的特定位置。此过程通常包罗以下几个步骤:
 
2.2 实验代码

  1. import cv2  # 导入OpenCV库
  2. # 从指定路径读取背景图像和logo图像
  3. img = cv2.imread("./flower.png")  # 背景图像
  4. logo = cv2.imread("./logo.png")   # logo图像
  5. # 对logo图像进行灰度化处理,然后应用二值化操作,得到一个白底的掩膜
  6. # 灰度化是将彩色图像转换为灰度图像,二值化是将灰度图像转换为只有黑白两种颜色的图像
  7. logo_gray = cv2.cvtColor(logo, cv2.COLOR_BGR2GRAY)  # 将logo图像从BGR颜色空间转换为灰度颜色空间
  8. _, logo_binary = cv2.threshold(logo_gray, 70, 255, cv2.THRESH_BINARY_INV)  # 对灰度图像进行二值化操作,使用反阈值法
  9. # 这里,70是阈值,255是最大值,cv2.THRESH_BINARY_INV表示将灰度值大于70的像素点设置为0(黑色),其余设置为255(白色)
  10. # 在背景图像中选取一个和logo图像同等大小的区域,作为要插入logo的位置
  11. # ROI是感兴趣区域(Region of Interest)的缩写
  12. ROI = img[10:10+logo.shape[0], 100:100+logo.shape[1]]  # 在背景图像中指定ROI的位置和大小
  13. ROI_logo = cv2.bitwise_and(ROI, ROI, mask=logo_binary)
  14. # 将处理后的ROI区域(实际上是经过掩膜处理的ROI,但这里由于逻辑问题,直接使用了ROI)与原始的logo图像进行融合
  15. # 注意:这里的融合方式(使用cv2.add)可能会导致颜色值溢出(超过255),通常需要对结果进行截断或归一化处理。
  16. img_logo = cv2.add(ROI_logo, logo)
  17. # 将融合的图像(实际上是经过错误处理的图像)替换到背景图像中指定的位置
  18. img[10:10+logo.shape[0], 100:100+logo.shape[1]] = img_logo  # 替换ROI区域
  19. # 显示处理后的图像
  20. cv2.imshow('image', img)
  21. cv2.waitKey(0)  # 等待用户按键操作,按任意键后关闭窗口
复制代码

2.3 实验征象


 三、辨认图片颜色并绘制轮廓

3.1 实验原理 

        在图像处理中,轮廓检测是一项紧张的技能,用于提取图像中的物体边界或形状。通过轮廓分析,我们可以对图像中的形状举行分类、提取或者进一步处理。该实验的焦点操纵是使用 OpenCV 提供的函数举行图像灰度化、二值化、轮廓提取以及轮廓排序。
 
3.2 实验代码

  1. import cv2  # 导入OpenCV库
  2. # 读取图像文件
  3. img = cv2.imread("./../12.11/card.png")
  4. # 将图像从BGR颜色空间转换为灰度图像
  5. img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  6. # 使用Otsu's二值化方法对灰度图像进行二值化处理
  7. # 这里的127是一个初始阈值,但实际上Otsu's方法会自动计算一个最佳阈值
  8. # 255是当像素值超过(或等于)阈值时的赋值
  9. # cv2.THRESH_BINARY + cv2.THRESH_OTSU表示使用Otsu's二值化
  10. _, img_binary = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
  11. # 在二值化图像中查找轮廓
  12. # cv2.RETR_LIST表示检索所有轮廓,但不创建任何父子关系
  13. # cv2.CHAIN_APPROX_SIMPLE表示压缩水平、垂直和对角线段,只保留它们的端点
  14. contours, hierarchy = cv2.findContours(img_binary, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
  15. # 创建一个列表来存储轮廓及其面积
  16. contour_areas = []
  17. for i in range(len(contours)):  # 注意:直接使用len(contours)即可,无需转换为列表
  18.     contour_areas.append((i, cv2.contourArea(contours[i])))  # 添加轮廓索引和面积到列表中
  19. # 按面积降序对轮廓列表进行排序
  20. contour_areas.sort(key=lambda x: x[1], reverse=True)
  21. # 获取面积第二大的轮廓的索引(索引从0开始,所以[1]表示第二大的轮廓)
  22. idx = contour_areas[1][0]
  23. # 复制原始图像,以便在其上绘制轮廓
  24. img_copy = img.copy()
  25. # 在复制的图像上绘制指定索引的轮廓
  26. # (0, 0, 255)表示轮廓的颜色为红色
  27. # 3表示轮廓线的厚度
  28. img_draw = cv2.drawContours(img_copy, contours, idx, (0, 0, 255), 3)
  29. # 显示原始图像和绘制了轮廓的图像
  30. cv2.imshow('image', img)  # 这里应该显示原始图像,但可能您想显示灰度图像或二值图像以对比
  31. cv2.imshow('image_draw', img_draw)  # 显示绘制了轮廓的图像
  32. # 等待按键按下,然后关闭所有窗口
  33. cv2.waitKey(0)
  34. cv2.destroyAllWindows()  # 添加了这行代码来确保所有窗口都被关闭
复制代码
 

3.3 实验征象


 
 
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




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