Python 全栈体系【四阶】(二十六)

第五章 深度学习

四、OpenCV

1. OpenCV安装

执行以下命令安装opencv-python库(核心库)和opencv-contrib-python库(贡献库)。注意:命令拷贝后要合成一行执行,中间不要换行。

# 安装opencv核心库
pip3 install  --user opencv-python==4.3.0.38 --index-url https://pypi.tuna.tsinghua.edu.cn/simple/  --trusted-host https://pypi.tuna.tsinghua.edu.cn
# 安装opencv贡献库
pip3 install  --user opencv-contrib-python==4.3.0.38 --index-url https://pypi.tuna.tsinghua.edu.cn/simple/  --trusted-host https://pypi.tuna.tsinghua.edu.cn

2. OpenCV基本操作

读取、图像、保存图像
# 读取图像
import cv2im = cv2.imread("../data/Linus.png", 1) # 1表示3通道彩色,0表示单通道灰度
cv2.imshow("test", im) # 在test窗口中显示图像print(type(im))  # 打印数据类型
print(im.shape)  # 打印图像尺寸cv2.imwrite("../data/Linus_2.png", im)  # 将图像保存到指定路径cv2.waitKey()  # 等待用户按键反馈
cv2.destroyAllWindows()  # 销毁所有创建的窗口"""
<class 'numpy.ndarray'>
(216, 160, 3)
"""

执行结果:
在这里插入图片描述

3. 图像色彩操作

3.1 彩色图像转换为灰度图像
# 彩色图像转换为灰度图像示例
import cv2im = cv2.imread("../data/Linus.png", 1)
cv2.imshow("RGB", im) # 在test窗口中显示图像# 使用cvtColor进行颜色空间变化,COLOR_BGR2GRAY表示BGR to GRAY
img_gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY) # 彩色图像灰度化
cv2.imshow("Gray", img_gray)cv2.waitKey()  # 等待用户按键反馈
cv2.destroyAllWindows()  # 销毁所有创建的窗口

执行结果:
在这里插入图片描述

3.2 色彩通道操作
# 色彩通道操作:通道表示为BGR
import numpy as np
import cv2im = cv2.imread("../data/opencv2.png")
print(im.shape)
cv2.imshow("im", im)# 取出蓝色通道,当做单通道图像显示
b = im[:, :, 0]
cv2.imshow("b", b)# 去掉蓝色通道(索引为0的通道)
im[:, :, 0] = 0
cv2.imshow("im-b0", im)# 去掉绿色通道(索引为1的通道)
im[:, :, 1] = 0
cv2.imshow("im-b0g0", im)cv2.waitKey()
cv2.destroyAllWindows()

执行结果:
在这里插入图片描述

3.3 灰度直方图均衡化
# 直方图均衡化示例
import numpy as np
import cv2
from matplotlib import pyplot as pltim = cv2.imread("../data/sunrise.jpg", 0)
cv2.imshow("orig", im)# 直方图均衡化
im_equ = cv2.equalizeHist(im)
cv2.imshow("equ1", im_equ)# 绘制灰度直方图
## 原始直方图
print(im.ravel())
plt.subplot(2, 1, 1)
plt.hist(im.ravel(), #ravel返回一个连续的扁平数组256, [0, 256], label="orig")
plt.legend()## 均衡化处理后的直方图
plt.subplot(2, 1, 2)
plt.hist(im_equ.ravel(), 256, [0, 256], label="equalize")
plt.legend()plt.show()cv2.waitKey()
cv2.destroyAllWindows()

执行结果:
在这里插入图片描述

3.4 彩色亮度直方图均衡化
# 彩色图像亮度直方图均衡化
import cv2# 读取原始图片
original = cv2.imread('../data/sunrise.jpg')
cv2.imshow('Original', original)# BRG空间转换为YUV空间
# YUV:亮度,色度,饱和度,其中Y通道为亮度通道
yuv = cv2.cvtColor(original, cv2.COLOR_BGR2YUV)
print("yuv.shape:", yuv.shape)yuv[..., 0] = cv2.equalizeHist(yuv[..., 0])  # 取出亮度通道,均衡化并赋回原图像
equalized_color = cv2.cvtColor(yuv, cv2.COLOR_YUV2BGR)
cv2.imshow('Equalized Color', equalized_color)cv2.waitKey()
cv2.destroyAllWindows()

执行结果:
在这里插入图片描述

3.5 色彩提取

从图片中提取特定颜色

import cv2
import numpy as npim = cv2.imread("../data/opencv2.png")
hsv = cv2.cvtColor(im, cv2.COLOR_BGR2HSV)
cv2.imshow('opencv', im)# =============指定蓝色值的范围=============
# 蓝色H通道值为120,通常取120上下10的范围
# S通道和V通道通常取50~255间,饱和度太低、色调太暗计算出来的颜色不准确
minBlue = np.array([110, 50, 50])
maxBlue = np.array([130, 255, 255])
# 确定蓝色区域
mask = cv2.inRange(hsv, minBlue, maxBlue)  # 选取出掩模
# cv2.imshow("mask", mask)
# 通过掩码控制的按位与运算,锁定蓝色区域
blue = cv2.bitwise_and(im, im, mask=mask)  # 执行掩模运算
cv2.imshow('blue', blue)# =============指定绿色值的范围=============
minGreen = np.array([50, 50, 50])
maxGreen = np.array([70, 255, 255])
# 确定绿色区域
mask = cv2.inRange(hsv, minGreen, maxGreen)
# cv2.imshow("mask", mask)
# 通过掩码控制的按位与运算,锁定绿色区域
green = cv2.bitwise_and(im, im, mask=mask)  # 执行掩模运算
cv2.imshow('green', green)# =============指定红色值的范围=============
minRed = np.array([0, 50, 50])
maxRed = np.array([30, 255, 255])
# 确定红色区域
mask = cv2.inRange(hsv, minRed, maxRed)
# cv2.imshow("mask", mask)
# 通过掩码控制的按位与运算,锁定红色区域
red = cv2.bitwise_and(im, im, mask=mask)  # 执行掩模运算
cv2.imshow('red', red)cv2.waitKey()
cv2.destroyAllWindows()

执行结果:
在这里插入图片描述

3.6 二值化与反二值化
# 二值化处理
import cv2 as cv# 读取图像
img = cv.imread("../data/lena.jpg", 0)
cv.imshow("img", img)  # 显示原始图像# 二值化
t, rst = cv.threshold(img, 127, 255, cv.THRESH_BINARY)
cv.imshow("rst", rst)  # 显示二值化图像# 反二值化
t, rst2 = cv.threshold(img, 127, 255, cv.THRESH_BINARY_INV)
cv.imshow("rst2", rst2)  # 显示反二值化图像cv.waitKey()
cv.destroyAllWindows()

执行结果:
在这里插入图片描述

4. 图像形态操作

4.1 图像翻转
# 图像翻转示例
import numpy as np
import cv2im = cv2.imread("../data/Linus.png")
cv2.imshow("src", im)# 0-垂直镜像
im_flip0 = cv2.flip(im, 0)
cv2.imshow("im_flip0", im_flip0)# 1-水平镜像
im_flip1 = cv2.flip(im, 1)
cv2.imshow("im_flip1", im_flip1)cv2.waitKey()
cv2.destroyAllWindows()

执行结果:
在这里插入图片描述

4.2 图像仿射变换
# 图像仿射变换
import numpy as np
import cv2def translate(img, x, y):"""坐标平移变换:param img: 原始图像数据:param x:平移的x坐标:param y:平移的y坐标:return:返回平移后的图像"""h, w = img.shape[:2]  # 获取图像高、宽# 定义平移矩阵M = np.float32([[1, 0, x],[0, 1, y]])# 使用openCV仿射操作实现平移变换shifted = cv2.warpAffine(img, M, (w, h))  # 第三个参数为输出图像尺寸return shifted  # 返回平移后的图像def rotate(img, angle, center=None, scale=1.0):"""图像旋转变换:param img: 原始图像数据:param angle: 旋转角度:param center: 旋转中心,如果为None则以原图中心为旋转中心:param scale: 缩放比例,默认为1:return: 返回旋转后的图像"""h, w = img.shape[:2]  # 获取图像高、宽# 旋转中心默认为图像中心if center is None:center = (w / 2, h / 2)# 计算旋转矩阵M = cv2.getRotationMatrix2D(center, angle, scale)# 使用openCV仿射变换实现函数旋转rotated = cv2.warpAffine(img, M, (w, h))return rotated  # 返回旋转后的矩阵if __name__ == "__main__":# 读取并显示原始图像im = cv2.imread("../data/Linus.png")cv2.imshow("SrcImg", im)# 图像向下移动50像素shifted = translate(im, 0, 50)cv2.imshow("Shifted1", shifted)# 图像向左移动40, 下移动40像素shifted = translate(im, -40, 40)cv2.imshow("Shifted2", shifted)# 逆时针旋转45度rotated = rotate(im, 45)cv2.imshow("rotated1", rotated)# 顺时针旋转180度rotated = rotate(im, -90)cv2.imshow("rorated2", rotated)cv2.waitKey()cv2.destroyAllWindows()

执行结果:
在这里插入图片描述

4.3 图像缩放
# 图像缩放示例
import numpy as np
import cv2im = cv2.imread("../data/Linus.png")
cv2.imshow("src", im)h, w = im.shape[:2]  # 获取图像尺寸dst_size = (int(w/2), int(h/2))  # 缩放目标尺寸,宽高均为原来1/2
resized = cv2.resize(im, dst_size)  # 执行缩放
cv2.imshow("reduce", resized)dst_size = (200, 300)  # 缩放目标尺寸,宽200,高300
method = cv2.INTER_NEAREST  # 最邻近插值
resized = cv2.resize(im, dst_size, interpolation=method)  # 执行缩放
cv2.imshow("NEAREST", resized)dst_size = (200, 300)  # 缩放目标尺寸,宽200,高300
method = cv2.INTER_LINEAR  # 双线性插值
resized = cv2.resize(im, dst_size, interpolation=method)  # 执行缩放
cv2.imshow("LINEAR", resized)cv2.waitKey()
cv2.destroyAllWindows()

执行结果:

4.4 图像裁剪
import numpy as np
import cv2# 图像随机裁剪
def random_crop(im, w, h):start_x = np.random.randint(0, im.shape[1])  # 裁剪起始x像素start_y = np.random.randint(0, im.shape[0])  # 裁剪起始y像素new_img = im[start_y:start_y + h, start_x: start_x + w]  # 执行裁剪return new_img# 图像中心裁剪
def center_crop(im, w, h):start_x = int(im.shape[1] / 2) - int(w / 2)  # 裁剪起始x像素start_y = int(im.shape[0] / 2) - int(h / 2)  # 裁剪起始y像素new_img = im[start_y:start_y + h, start_x: start_x + w]  # 执行裁剪return new_imgim = cv2.imread("../data/banana_1.png", 1)new_img = random_crop(im, 200, 200)  # 随机裁剪
new_img2 = center_crop(im, 200, 200)  # 中心裁剪cv2.imshow("orig", im)
cv2.imshow("random_crop", new_img)
cv2.imshow("center_crop", new_img2)cv2.waitKey()
cv2.destroyAllWindows()

执行结果:
在这里插入图片描述

4.5 图像相加
# 图像相加示例
import cv2a = cv2.imread("../data/lena.jpg", 0)
b = cv2.imread("../data/lily_square.png", 0)dst1 = cv2.add(a, b)  # 图像直接相加,会导致图像过亮、过白# 加权求和:addWeighted
# 图像进行加权和计算时,要求src1和src2必须大小、类型相同
dst2 = cv2.addWeighted(a, 0.6, b, 0.4, 0)  # 最后一个参数为亮度调节量cv2.imshow("a", a)
cv2.imshow("b", b)
cv2.imshow("dst1", dst1)
cv2.imshow("dst2", dst2)cv2.waitKey()
cv2.destroyAllWindows()

执行结果:
在这里插入图片描述

4.6 图像相减
# 图像相减运算示例
import cv2a = cv2.imread("../data/3.png", 0)
b = cv2.imread("../data/4.png", 0)dst = cv2.subtract(a, b)  # 两幅图像相减,是求出图像的差异cv2.imshow("a", a)
cv2.imshow("b", b)
cv2.imshow("dst1", dst)cv2.waitKey()
cv2.destroyAllWindows()

执行结果:
在这里插入图片描述

4.7 透视变换
# 透视变换
import cv2
import numpy as npimg = cv2.imread('../data/pers.png')
rows, cols = img.shape[:2]
print(rows, cols)pts1 = np.float32([[58, 2], [167, 9], [8, 196], [126, 196]])# 输入图像四个顶点坐标
pts2 = np.float32([[16, 2], [167, 8], [8, 196], [169, 196]])# 输出图像四个顶点坐标# 生成透视变换矩阵
M = cv2.getPerspectiveTransform(pts1, # 输入图像四个顶点坐标pts2) # 输出图像四个顶点坐标
print(M.shape)
# 执行透视变换,返回变换后的图像
dst = cv2.warpPerspective(img, # 原始图像M, # 3*3的变换矩阵(cols, rows)) # 输出图像大小# 生成透视变换矩阵
M = cv2.getPerspectiveTransform(pts2, # 输入图像四个顶点坐标pts1) # 输出图像四个顶点坐标
# 执行透视变换,返回变换后的图像
dst2 = cv2.warpPerspective(dst, # 原始图像M, # 3*3的变换矩阵(cols, rows)) # 输出图像大小
cv2.imshow("img", img)
cv2.imshow("dst", dst)
cv2.imshow("dst2", dst2)cv2.waitKey()
cv2.destroyAllWindows()

执行结果:
在这里插入图片描述

4.8 图像腐蚀
# 图像腐蚀
import cv2
import numpy as np# 读取原始图像
im = cv2.imread("../data/5.png")
cv2.imshow("im", im)# 腐蚀
kernel = np.ones((3, 3), np.uint8) # 用于腐蚀计算的核
erosion = cv2.erode(im, # 原始图像kernel,  # 腐蚀核iterations=3) # 迭代次数
cv2.imshow("erosion", erosion)cv2.waitKey()
cv2.destroyAllWindows()

执行结果:
在这里插入图片描述

4.9 图像膨胀
# 图像膨胀
import cv2
import numpy as np# 读取原始图像
im = cv2.imread("../data/6.png")
cv2.imshow("im", im)# 膨胀
kernel = np.ones((3, 3), np.uint8)  # 用于膨胀计算的核
dilation = cv2.dilate(im,  # 原始图像kernel,  # 膨胀核iterations=5)  # 迭代次数
cv2.imshow("dilation", dilation)cv2.waitKey()
cv2.destroyAllWindows()

执行结果:
在这里插入图片描述

4.10 图像开运算
# 开运算示例
import cv2
import numpy as np# 读取原始图像
im1 = cv2.imread("../data/7.png")
im2 = cv2.imread("../data/8.png")# 执行开运算
k = np.ones((10, 10), np.uint8)
r1 = cv2.morphologyEx(im1, cv2.MORPH_OPEN, k)
r2 = cv2.morphologyEx(im2, cv2.MORPH_OPEN, k)cv2.imshow("im1", im1)
cv2.imshow("result1", r1)cv2.imshow("im2", im2)
cv2.imshow("result2", r2)cv2.waitKey()
cv2.destroyAllWindows()

执行结果:
在这里插入图片描述

4.11 图像闭运算
# 闭运算示例
import cv2
import numpy as np# 读取图像
im1 = cv2.imread("../data/9.png")
im2 = cv2.imread("../data/10.png")# 闭运算
k = np.ones((8, 8), np.uint8)
r1 = cv2.morphologyEx(im1, cv2.MORPH_CLOSE, k, iterations=2)
r2 = cv2.morphologyEx(im2, cv2.MORPH_CLOSE, k, iterations=2)cv2.imshow("im1", im1)
cv2.imshow("result1", r1)
cv2.imshow("im2", im2)
cv2.imshow("result2", r2)cv2.waitKey()
cv2.destroyAllWindows()

执行结果:
在这里插入图片描述

4.11 形态学梯度
# 形态学梯度示例
import cv2
import numpy as npo = cv2.imread("../data/6.png")k = np.ones((3, 3), np.uint8)
r = cv2.morphologyEx(o, cv2.MORPH_GRADIENT, k)cv2.imshow("original", o)
cv2.imshow("result", r)cv2.waitKey()
cv2.destroyAllWindows()

执行结果:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/610272.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用于扩展Qt本身的插件(上)

Qt自身插件 引言示例插件与应用插件的程序作为整体插件和应用插件的程序单独存在实现插件编写测试插件的程序应用插件运行结果引言 用于扩展qt自身的插件按照我的理解分为两种: 1. 直接扩展Qt自身,无需在QtCreator的设计器中加载; 2. 扩展Qt自身,同时需要在QtCreator的设计…

Java | Leetcode Java题解之第16题最接近的三数之和

题目&#xff1a; 题解&#xff1a; class Solution {public int threeSumClosest(int[] nums, int target) {Arrays.sort(nums);int n nums.length;int best 10000000;// 枚举 afor (int i 0; i < n; i) {// 保证和上一次枚举的元素不相等if (i > 0 && nums…

每天学点儿Python(6) -- 列表和枚举

列表是Python中内置的可变序列&#xff0c;类使用C/C中的数组&#xff0c;使用 [ ] 定义列表&#xff0c;列表中的元素与元素之间用英文逗号&#xff08; , &#xff09;分隔&#xff0c; 但是Python中列表可以存储任意类型的数据&#xff0c;且可以混存&#xff08;即类型可以…

未来课堂革命:OpenAI 发布 ChatGPT 使用指南,探索生成式 AI 如何重塑教育景观

随着新学期的来临&#xff0c;众多初登教师舞台的 00 后们&#xff0c;也完成了他们的第一个教师身份下的暑期生活。 对于开学的抵触情绪&#xff0c;不仅学生们普遍存在&#xff0c;许多 00 后的新晋教师们也同样感同身受。某种程度上&#xff0c;这些抗拒上班的年轻教师群体…

蓝牙app设计 (方案一)app inventor

app Inventor是一款谷歌公司开发的手机编程软件。 谷歌推出一款名叫Google App Inventor的工具软件, Google App Inventor用户能够通过该工具软件使用谷歌的Android系列软件自行研发适合手机使用的任意应用程序。 而且这款编程软件不一定非要是专业的研发人员,甚至根本不需要…

Chatgpt掘金之旅—有爱AI商业实战篇|在线课程业务|(十五)

演示站点&#xff1a; https://ai.uaai.cn 对话模块 官方论坛&#xff1a; www.jingyuai.com 京娱AI 一、AI技术创业在线课程业务有哪些机会&#xff1f; 人工智能&#xff08;AI&#xff09;技术作为当今科技创新的前沿领域&#xff0c;为创业者提供了广阔的机会和挑战。随着…

langchain txt 文档加载,分割

stuff 策略 加载 arXiv 论文&#xff0c;让模型总结前 2000 字 这里采用的是 stuff 策略&#xff0c;也就是将一大段文本。按字数分割成 N 个文本块&#xff0c;又合并成一个大的文本块。 对超大规模不友好&#xff0c;没有区分文档重要性&#xff0c;适合文档量较少场景 i…

SystemUI QuickQSPanel所在的位置

QuickQSPanel 为蓝色 位置&#xff1a; quick_status_bar_expanded_header.xml 图片&#xff1a;

Qt中播放GIF动画

在Qt应用程序中&#xff0c;如果你想在QLabel控件上播放GIF动画&#xff0c;可以使用QMovie类与QLabel配合来实现。以下是详细步骤和代码示例&#xff1a; 步骤1&#xff1a;引入必要的头文件 首先&#xff0c;在你的源代码文件中包含QMovie和QLabel相关的头文件&#xff1a;…

解决Idea中文乱码

解决 Idea 中文乱码问题的方法通常包括以下几个步骤&#xff1a; 1、调整文件编码&#xff1a;确保项目中的文件编码与 Idea 中的编码设置一致。通常情况下&#xff0c;使用 UTF-8 编码是比较合适的选择。你可以在 Idea 中通过 File -> Settings -> Editor -> File E…

集装箱5G智能制造工厂数字孪生可视化平台,推进企业数字化转型

集装箱5G智能制造工厂数字孪生可视化平台&#xff0c;推进企业数字化转型。在当下数字化转型的热潮中&#xff0c;集装箱5G智能制造工厂数字孪生可视化平台成为了推动企业转型升级的重要工具。这一平台将先进的5G技术与智能制造相结合&#xff0c;通过数字孪生技术实现生产过程…

SQL优化之EXPLAIN执行计划(转载)

目录 第一章、快速了解EXPLAIN1.1&#xff09;EXPLAIN是什么1.2&#xff09;示例 第二章、结果列说明2.1&#xff09;id 与table2.2&#xff09;select_type&#xff1a;2.3&#xff09;type2.4&#xff09;possible_keys与key2.5&#xff09; key_len2.6&#xff09;rows2.7&a…