【人工智能学习之图像操作(二)】

news2024/12/24 3:56:05

【人工智能学习之图像操作(二)】

  • 图像上的运算
    • 图像混合
    • 按位运算
  • 图像的几何变换
    • 仿射变换
    • 透视变换
    • 膨胀操作
    • 腐蚀操作
    • 开操作
    • 闭操作
    • 梯度操作
    • 礼帽操作
    • 黑帽操作

图像上的运算

图像上的算术运算,加法,减法,图像混合等。

加减法:

import cv2
import numpy as np
x = np.uint8([250])
y = np.uint8([10])
print(cv2.add(x,y))
print(cv2.subtract(x,y))

图像混合

这其实也是加法,但是不同的是两幅图像的权重不同,这就会给人一种混合或者透明的感觉。图像混合的计算公式如下:
g (x) = (1 − α) f0 (x) + α f1 (x)
通过修改 α 的值(0 → 1),可以实现非常酷的混合。

现在我们把两幅图混合在一起。第一幅图的权重是 0.7,第二幅图的权重是 0.3。函数cv2.addWeighted() 可以按下面的公式对图片进行混合操作。
dst = α · img1 + β · img2 + γ
这里 γ 的取值为 0。

import cv2
img1 = cv2.imread('1.jpg')
img2 = cv2.imread('9.jpg')
dst = cv2.addWeighted(img1, 0.7, img2, 0.3, 0)
cv2.imshow('dst', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

按位运算

这里包括的按位操作有:AND,OR,NOT,XOR 等。当我们提取图像的一部分,选择非矩形 ROI 时这些操作会很有用(下一章你就会明白)。下面的例子就是教给我们如何改变一幅图的特定区域。我想把OpenCV 的标志放到另一幅图像上。如果我使用加法,颜色会改变,如果使用混合,会得到透明效果,但是我不想要透明。

import cv2
img1 = cv2.imread('1.jpg')
img2 = cv2.imread('9.jpg')
rows, cols, channels = img2.shape
roi = img1[0:rows, 0:cols]
img2gray = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
ret, mask = cv2.threshold(img2gray, 10, 255, cv2.THRESH_BINARY)
mask_inv = cv2.bitwise_not(mask)
# cv2.imshow("mask_inv",mask_inv)
img1_bg = cv2.bitwise_and(roi, roi, mask=mask_inv)
# cv2.imshow("img1_bg",img1_bg)
img2_fg = cv2.bitwise_and(img2, img2, mask=mask)
# cv2.imshow("img2_fg",img2_fg)
dst = cv2.add(img1_bg, img2_fg)
img1[0:rows, 0:cols] = dst
cv2.imshow('res', img1)
cv2.waitKey(0)

图像的几何变换

Resize/transport/flip:

import cv2
src = cv2.imread('1.jpg')
rows, cols, channel = src.shape
dst = cv2.resize(src, (cols * 2, rows * 2), interpolation=cv2.INTER_CUBIC)
# dst = cv2.transpose(src)
# dst = cv2.flip(src, 0)
cv2.imshow('src pic', src)
cv2.imshow('dst pic', dst)
cv2.waitKey(0)

interpolation参数说明:

  • INTER_NEAREST - 最邻近插值
  • INTER_LINEAR - 双线性插值,如果最后一个参数你不指定,默认使用这种方法
  • INTER_AREA -区域插值
  • INTER_CUBIC - 4x4像素邻域内的双立方插值
  • INTER_LANCZOS4 - 8x8像素邻域内的Lanczos插值

仿射变换

任意一个二维图像,我们乘以一个仿射矩阵,就能得到仿射变换后的图像。变换包含:缩放、旋转、平移、倾斜、镜像。
在这里插入图片描述

import cv2
import numpy as np
src = cv2.imread('1.jpg')
rows, cols, channel = src.shape
M = np.float32([[1, 0, 50], [0, 1, 50]])
# M = np.float32([[0.5, 0, 0], [0, 0.5, 0]])
# M = np.float32([[-0.5, 0, cols // 2], [0, 0.5, 0]])
# M = np.float32([[1, 0.5, 0], [0, 1, 0]])
# M = cv2.getRotationMatrix2D((cols / 2, rows / 2), 45, 0.7)
dst = cv2.warpAffine(src, M, (cols, rows))
cv2.imshow('src pic', src)
cv2.imshow('dst pic', dst)
cv2.waitKey(0)

透视变换

import cv2
import numpy as np
img = cv2.imread("4.jpg")
pts1 = np.float32([[25, 30], [179, 25], [12, 188], [189, 190]])
pts2 = np.float32([[0, 0], [200, 0], [0, 200], [200, 200]])
M = cv2.getPerspectiveTransform(pts1, pts2)
dst = cv2.warpPerspective(img, M, (200, 201))
cv2.imshow("src", img)
cv2.imshow("dst", dst)
cv2.waitKey(0)

膨胀操作

  • 膨胀操作可以让颜色值大的像素变得更粗
  • 膨胀操作前,需要二值化图像
import cv2 as cv
img = cv.imread("11.jpg", 0)
kernel = cv.getStructuringElement(cv.MORPH_RECT, (5, 5))
dst = cv.dilate(img, kernel)
cv.imshow('src', img)
cv.imshow('dst', dst)
cv.waitKey(0)

腐蚀操作

  • 腐蚀操作可以让颜色值大的像素变得更细
  • 腐蚀操作前,需要二值化图像
import cv2 as cv
img = cv.imread("11.jpg", 0)
kernel = cv.getStructuringElement(cv.MORPH_RECT, (5, 5))
dst = cv.erode(img, kernel)
cv.imshow('src', img)
cv.imshow('dst', dst)
cv.waitKey(0)

开操作

  • 开操作是先腐蚀再膨胀
  • 开操作可以用于去噪
import cv2 as cv
img = cv.imread("10.jpg", 0)
kernel = cv.getStructuringElement(cv.MORPH_RECT, (3, 3))
dst = cv.morphologyEx(img, cv.MORPH_OPEN, kernel, iterations=1)
cv.imshow('src', img)
cv.imshow('dst', dst)
cv.waitKey(0)

闭操作

  • 闭操作是先膨胀再腐蚀
  • 闭操作可以用于补漏洞
import cv2 as cv
img = cv.imread("10.jpg", 0)
kernel = cv.getStructuringElement(cv.MORPH_RECT, (3, 3))
dst = cv.morphologyEx(img, cv.MORPH_CLOSE, kernel, iterations=1)
cv.imshow('src', img)
cv.imshow('dst', dst)
cv.waitKey(0)

梯度操作

膨胀减去腐蚀

import cv2 as cv
img = cv.imread("11.jpg", 0)
kernel = cv.getStructuringElement(cv.MORPH_RECT, (3, 3))
dst = cv.morphologyEx(img, cv.MORPH_GRADIENT, kernel)
cv.imwrite("21.jpg", dst)
cv.imshow('src', img)
cv.imshow('dst', dst)
cv.waitKey(0)

礼帽操作

  • 礼帽操作=开运算图像-原图像
  • 获取噪音
import cv2 as cv
img = cv.imread("11.jpg", 0)
kernel = cv.getStructuringElement(cv.MORPH_RECT, (3, 3))
dst = cv.morphologyEx(img, cv.MORPH_GRADIENT, kernel)
cv.imshow('src', img)
cv.imshow('dst', dst)
cv.waitKey(0)

黑帽操作

  • 黑帽操作=闭运算图像 - 原图像
  • 获取漏洞
import cv2 as cv
img = cv.imread("10.jpg", 0)
kernel = cv.getStructuringElement(cv.MORPH_RECT, (3, 3))
dst = cv.morphologyEx(img, cv.MORPH_BLACKHAT, kernel)
cv.imshow('src', img)
cv.imshow('dst', dst)
cv.waitKey(0)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI进阶指南第五课,大模型相关概念(知识库,微调)

虽然前面大概讲了一下大模型的一些基本概念,但是那些都比较偏向于大模型本身,但是我们使用的时候如果只靠大模型肯定是不行的。 就好比如果一个人只有一个脑子,其他什么部位也没有的话,那场面。(感觉现在网上的AI图片…

泰迪智能科技实验室产品-云计算资源管理平台介绍

云计算资源管理平台是一款集群应用程序管理平台,以Docker、Kubernetes为核心引擎的容器化应用部署、运行环境,对数据中心的物理服务器、网络、存储、虚拟服务器等基础架构资源进行集中统一的管理、分配、监控等。平台旨在围绕行业应用逐步由“虚拟化”向…

llama-3 本地化部署实验

国产大模型的API 有限,编写langchain 应用问题很多。使用openai 总是遇到网络问题,尝试使用ollama在本地运行llama-3。结果异常简单。效果不错。llama-3 的推理能力感觉比openai 的GPT-3.5 好。 Ollama 下载 官网:https://ollama.com/downl…

计算机毕业设计hadoop+spark+hive知识图谱医生推荐系统 医生数据分析可视化大屏 医生爬虫 医疗可视化 医生大数据 机器学习 大数据毕业设计

测试过程及结果 本次对于医生推荐系统测试通过手动测试的方式共进行了两轮测试。 (1)第一轮测试中执行了个20个测试用例,通过16个,失败4个,其中属于严重缺陷的1个,属于一般缺陷的3个。 (2&am…

llm学习2--使用embedding和数据处理

首先可以简单了解一下向量数据库相关知识: 向量数据库相关知识(搬运学习,建议还是看原文,这个只是我自己的学习记录)-CSDN博客 补充: 使用embedding API 文心千帆API Embedding-V1是基于百度文心大模型…

微服务应用与开发知识点练习【Gateway,OpenFeign,Dubbo,RocketMQ和RabbitMQ,JPA,Redis,Mycat】

一、选择题 【Gateway】 1.Spring Cloud Gateway与Nacos整合实现负载均衡时,路由配置中的URI前缀应该是?(A ) A. lb:// B. nacos:// C. http:// D. discovery:// Spring Cloud Gateway与Nacos整合实现负载均衡时&#xff0c…

【Linux系统编程】进程控制(创建、退出、等待、替换)

目录 再聊进程创建 进程终止 进程等待 进程程序替换 再聊进程创建 初识进程创建 关于进程创建,这里只会说结论,在上面这篇文章中对进程创建进行了比较详细的阐述,而接下来要介绍的,都是基于上文说过的来展开的 一些较为重要…

【FFmpeg】avformat_alloc_output_context2函数

【FFmpeg】avformat_alloc_output_context2函数 1.avformat_alloc_output_context21.1 初始化AVFormatContext(avformat_alloc_context)1.2 格式猜测(av_guess_format)1.2.1 遍历可用的fmt(av_muxer_iterate&#xff0…

Bad owner or permissions on C:\\Users\\username/.ssh/config > 过程试图写入的管道不存在。

使用windows连接远程服务器出现Bad owner or permissions 错误 问题: 需要修复文件权限 SSH 配置文件应具有受限权限以防止未经授权的访问 确保只有用户对该.ssh/config文件具有读取权限 解决方案: 在windows下打开命令行,通过以下命令打开文…

Spring Cloud Alibaba之负载均衡组件Ribbon

一、什么是负载均衡? (1)概念: 在基于微服务架构开发的系统里,为了能够提升系统应对高并发的能力,开发人员通常会把具有相同业务功能的模块同时部署到多台的服务器中,并把访问业务功能的请求均…

Kubernetes之 资源管理

系列文章目录 Kubernetes之 资源管理 文章目录 系列文章目录前言一、资源管理介绍二、YAML语言介绍 1.1.YAML语法:2.读入数据总结 一、资源管理介绍 在kubernetes中,所有的内容都抽象为资源,用户需要通过操作资源来管理kubernetes。 1. kub…

SMTP 转发器/中继

设置中继邮件服务器 我将设置一个邮件服务器,该服务器稍后将用作 SMTP 中继服务器。首先,在 Digital Ocean 中创建了一个新的 Ubuntu Droplet: Postfix MTA 安装在droplet上,并带有: apt-get install postfix 在pos…

序列检测器(Moore型)

目录 描述 输入描述: 输出描述: 参考代码 描述 请用Moore型状态机实现序列“1101”从左至右的不重叠检测。 电路的接口如下图所示。当检测到“1101”,Y输出一个时钟周期的高电平脉冲。 接口电路图如下: 输入描述&#xff1a…

【机器学习300问】132、自注意力机制(Self-Attention)和传统注意力机制(Attention)的区别?

最近学习注意力机制的时候,发现相同的概念很多,有必要给这些概念做一下区分,不然后续的学习可能会混成一团。本文先区分一下自注意力机制和传统注意力机制。我会先直接给出它们之间有何区别的结论,然后通过一个例子来说明。 【机…

阿里云服务器通过镜像下hunggingface上的模型

参考连接https://blog.csdn.net/lanlinjnc/article/details/136709225 https://www.bilibili.com/video/BV1VT421X7xe/?spm_id_from333.337.search-card.all.click&vd_source1ba257184239f03bd3caf4c6cab427e4 pip install -U huggingface_hub# 建议将上面这一行写入 ~/…

Ubuntu Nvidia GPU驱动安装和故障排除

去官网 菜单列表下载,或者直接下载驱动 wget https://cn.download.nvidia.com/XFree86/Linux-x86_64/550.54.14/NVIDIA-Linux-x86_64-550.54.14.run 安装驱动 /data/install/NVIDIA-Linux-x86_64-550.54.14.run 执行命令,显示GPU情况 出错处理&…

Android开发系列(十一)Jetpack Compose之Dialog

Dialogs是在应用程序中显示一些额外信息或进行用户交互的常见功能。Jetpack Compose中的Dialog可以通过使用AlertDialog组件来创建。 基本用法 下面通过示例来了解Dialog的使用。 OptIn(ExperimentalMaterial3Api::class) Composable fun AlertDialogExample(onDismissReques…

vue3用自定义指令实现按钮权限

1,编写permission.ts文件 在src/utils/permission.ts import type { Directive } from "vue"; export const permission:Directive{// 在绑定元素的父组件被挂载后调用mounted(el,binding){// el:指令所绑定的元素,可以用来直接操…

从文章到视频:如何用ChatGPT打造自媒体全能内容

在当今自媒体时代,内容创作的多样性和多元化成为了吸引和保持观众注意力的关键。无论是文章、视频还是音频内容,创作者们都需要灵活运用各种形式来触达不同的受众群体。ChatGPT作为一种先进的AI语言模型,能够为自媒体创作者提供强大的支持&am…

通过代理从ARDUINO IDE直接下载开发板包

使用免费代理 实现ARDUINO IDE2.3.2 下载ESP8266/ESP32包 免费代理 列表 测试代理是否可用的 网站 有时,代理是可用的,但依然有可能找不到开发板管理器的资料包。 可以多换几个代理试试。 代理的配置 文件 -> 首选项 -> 网络 进入后做如下配置…