视觉的边界填充、数值计算和腐蚀操作

news2024/11/28 17:59:15

文章目录

    • 一、边界填充
    • 二、数值计算
    • 三、图片融合
    • 四、腐蚀操作

一、边界填充

边界填充的4种方法:
在这里插入图片描述

# 导入OpenCV库,用于图像处理
import cv2
# 导入matplotlib的pyplot模块,用于图像显示
import matplotlib.pyplot as plt
# 导入numpy库,用于数值计算(虽然在这个代码中没有使用到)
import numpy as np

# 定义一个函数cv2_show,用于显示图像
def cv2_show(name, img):
    # 使用cv2.imshow()函数显示图像
    cv2.imshow(name, img)
    # 使用cv2.waitKey(0)函数等待,直到用户按下任意键
    cv2.waitKey(0)
    # 使用cv2.destroyAllWindows()函数关闭所有OpenCV创建的窗口
    cv2.destroyAllWindows()

# 使用cv2.imread()函数读取位于指定路径的图像文件
img = cv2.imread("E:\\XUEXI\\Python_learn\\tupian\\1.jpg")

# 设置边框的大小
top_size, bottom_size, left_size, right_size = (50, 50, 50, 50)

# 使用cv2.copyMakeBorder()函数为图像添加边框
# BORDER_REPLICATE:复制边缘像素
replicate = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, borderType=cv2.BORDER_REPLICATE)
# BORDER_REFLECT:反射式边界
reflect = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_REFLECT)
# BORDER_REFLECT_101:一种特殊的反射边界
reflect101 = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_REFLECT_101)
# BORDER_WRAP:环绕式边界
wrap = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_WRAP)
# BORDER_CONSTANT:填充一个常数值,这里设置为黑色(0表示黑色)
constant = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_CONSTANT, value=[0, 0, 0])

# 使用matplotlib.pyplot显示图像
# subplot(231)表示在一个2x3的网格中的第一个位置显示图像
# imshow函数显示图像,"gray"表示以灰度模式显示
# title设置图像的标题
plt.subplot(231), plt.imshow(img, "gray"), plt.title('ORIGINAL')
plt.subplot(232), plt.imshow(replicate, "gray"), plt.title('REPLICATE')
plt.subplot(233), plt.imshow(reflect, "gray"), plt.title('REFLECT')
plt.subplot(234), plt.imshow(reflect101, "gray"), plt.title('REFLECT_101')
plt.subplot(235), plt.imshow(wrap, "gray"), plt.title('WRAP')
plt.subplot(236), plt.imshow(constant, "gray"), plt.title('CONSTANT')

# 显示所有图像
plt.show()

cv2.copyMakeBorder()函数为图像添加边框

replicate = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, borderType=cv2.BORDER_REPLICATE)

上代码注释:
img:是要添加边框的原始图像。
top_size:是图像上边边框的厚度。
bottom_size:是图像下边边框的厚度。
left_size:是图像左边边框的厚度。
right_size:是图像右边边框的厚度。
borderType:指定边框的类型。在这里使用的是cv2.BORDER_REPLICATE,这意味着边框将通过复制边缘像素来创建。也就是说,新添加的边框上的每个像素将与原图像的最边缘像素相同。
replicate:是新创建的图像,其边框已经按照指定的类型添加。

使用matplotlib.pyplot显示图像

subplot(231)表示在一个2x3的网格中的第一个位置显示图像

imshow函数显示图像,"gray"表示以灰度模式显示

title设置图像的标题

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

二、数值计算

在这里插入图片描述
由上图可知,图片参数加10,对应的像素点都会加10

img_cat[:5, :, 0]

img_cat:代表一个图像数组。
[:5]:表示选择图像的前5行。
[:, :]:表示选择所有列。
[0]:表示选择BGR颜色空间中的第一个通道,即蓝色通道。
所以,img_cat[:5, :, 0]的作用是提取图像img_cat的前5行和所有列的蓝色通道的像素值。

考虑一下,像素的参数是【0-255】,那么相加如果超出255,会发生什么?

在这里插入图片描述
如上图,将img_cat + img_cat2,拿第一个值来计算一下,是(142+152)=294,超出了255峰值。
那么直接相加会进行余256进行计算得到值。294%256=1…38,所以取得的值为38

而如果使用cv2.add(img_cat,img_cat2)进行运算,opencv在值超过峰值的时候选取峰值作为结果,如(142+152)=294>=255,取得255

三、图片融合

在这里插入图片描述

如果直接将两张照片进行相加,会出现上面的报错,报错的原因是cat的图片规格是(414,500,3) dog的图片规格是(429,499,3),他们的图片尺寸不相同,所以发生报错。

所以需要对其中一张图片进行resize一下,以确保两张图片的规格一样。

实际代码:

import cv2
import matplotlib.pyplot as plt
import numpy as np

def cv2_show(name,img):
    cv2.imshow(name,img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

img = cv2.imread("E:\\XUEXI\\Python_learn\\tupian\\1.jpg")
img2 = cv2.imread("E:\\XUEXI\\Python_learn\\tupian\\2.webp")

img3 = img + img2

运行结果:
在这里插入图片描述
可以看到两张图片的尺寸不相同,img为(500,500,3),而img2为(500,800,3) 两个像素不同,必须调整为一样才可以将两者进行相加。

import cv2
import matplotlib.pyplot as plt
import numpy as np

def cv2_show(name,img):
    cv2.imshow(name,img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

img = cv2.imread("E:\\XUEXI\\Python_learn\\tupian\\1.jpg")
img2 = cv2.imread("E:\\XUEXI\\Python_learn\\tupian\\2.webp")

img_new = cv2.resize(img, (800, 500))
res = cv2.addWeighted(img_new, 0.4, img2, 0.6, 0)
plt.imshow(res)
plt.show()  # 显示图像窗口

注:res = cv2.addWeighted(img_new, 0.4, img2, 0.6, 0)
img_new:第一张图像,经过了大小调整(800x500)。
0.4:第一张图像的权重,即 img_new 在融合结果中的比重。
img2:第二张图像。
0.6:第二张图像的权重,即 img2 在融合结果中的比重。
0:加到融合结果上的标量值,这里设置为0,表示不添加额外的值。

plt.imshow(res)
plt.imshow 函数的作用是在 matplotlib 的绘图区域中绘制图像,但它本身不会立即显示图像。要显示图像,需要调用 plt.show() 函数。这是因为 matplotlib 采用一种“绘制然后显示”的模式:
绘制:plt.imshow 将图像绘制到内存中的一个缓冲区,但不会立即显示它。
显示:plt.show() 函数负责将内存中绘制的图像渲染到屏幕上。这个函数会阻塞代码执行,直到用户关闭图像窗口为止。

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

四、腐蚀操作

腐蚀操作会将边缘的一些细节给处理掉,处理的程度取决于卷积核的大小还有腐蚀次数。

拿下面的这张照片来举个例子:
在这里插入图片描述
可以看到照片中的“森哥”有很多小毛毛,可以通过腐蚀操作将这些小毛毛给去除掉。

# 导入OpenCV库,用于图像处理
import cv2
# 导入matplotlib的pyplot模块,用于图像显示
import matplotlib.pyplot as plt
# 导入numpy库,用于数值计算
import numpy as np

# 使用cv2.imread()函数读取位于指定路径的图像文件
img = cv2.imread("E:\\XUEXI\\Python_learn\\tupian\\3.jpg")

# 创建一个10x10的矩形结构元素,用于形态学操作
# np.ones((10,10),np.uint8)创建一个所有元素都是1的10x10矩阵
kernel = np.ones((10, 10), np.uint8)

# 使用cv2.erode()函数对图像进行腐蚀操作一次
erosion_1 = cv2.erode(img, kernel, iterations=1)

# 使用cv2.erode()函数对图像进行腐蚀操作两次
erosion_2 = cv2.erode(img, kernel, iterations=2)

# 使用cv2.erode()函数对图像进行腐蚀操作三次
erosion_3 = cv2.erode(img, kernel, iterations=3)

# 使用numpy的hstack()函数将三个腐蚀后的图像水平堆叠在一起
res = np.hstack((erosion_1, erosion_2, erosion_3))

# 显示堆叠后的图像
cv2.imshow("res", res)
# 等待用户按下任意键
cv2.waitKey(0)
# 关闭所有OpenCV创建的窗口
cv2.destroyAllWindows()

腐蚀一次:
在这里插入图片描述

腐蚀两次:
在这里插入图片描述

腐蚀三次:
在这里插入图片描述

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

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

相关文章

【Unity】Unity中接入Admob聚合广告平台,可通过中介接入 AppLovin,Unity Ads,Meta等渠道的广告

一、下载Google Admob的SDK插件 到Google Admob官网中,切换到Unity平台 进来之后是这样,注意后面有Unity标识,然后点击下载,跳转到github中,下载最新的Admob插件sdk,导入到Unity中 二、阅读官方文档&…

js 实现斐波那契数列

斐波那契数列:所谓斐波那契数列指的是数列:1,1,2,3,5,8,13,21,……。即数列满足递推公式,F(0)0,F(1)1 实现代码: 第一种&…

【记录】Django数据库的基础操作

数据库连接 在Django中使用 mysqlclient 这个包用于数据库的连接,切换至 Django环境中直接 pip install mysqlclient 安装此包 1 数据库连接配置 在项目目录下的setting.py中配置 DATABASES {default: {ENGINE: django.db.backends.mysql,NAME: mini,#数据库名US…

(IOS)VMware虚拟机上安装win10系统(超详细)

简介 虚拟机是一种软件实现的计算机系统,可以在现有的操作系统平台上运行一个或多个虚拟的操作系统。它通过在主机操作系统上创建一个虚拟的硬件平台,并在其上运行一个完整的操作系统,来模拟一个真实的物理计算机。虚拟机可以提供一种隔离的…

青少年编程能力等级测评CPA C++(二级)试卷(1)

青少年编程能力等级测评CPA C(二级)试卷(1) 一、单项选择题(共20题,每题3.5分,共70分) CP2_1_1.下列C程序段中,对二维数组arr的正确定义是( &am…

PL/SQL Developer如何连接Oracle数据库(汉化)

简介 PL/SQL Developer是一种用于Oracle数据库开发的集成开发环境(IDE)。它提供了一个可视化的界面,使开发人员能够方便地编写、调试和执行PL/SQL代码。PL/SQL Developer还具有其他功能,如数据库对象浏览器、SQL编辑器、数据导入…

python深浅拷贝,可变变量与不可变变量

赋值 在 python 中,赋值是将一个值或对象分配给一个变量的过程。赋值操作符是 ,用于将右侧的值或对象赋给左侧的变量。 赋值:l2的值会随着原对象l1的值一同改变 l1 [1, 2, 3, 4] print(l1:, l1) l2 l1 print(l2:, l2) 给li列表新增元素 …

Java基础:面向对象编程3

1 Java可变长参数 1.1 概述 Java 的可变长参数(Varargs)是在 Java 1.5 中引入的功能,允许方法接受任意数量的相同类型的参数。可变参数的语法是在参数类型后面加上三个点(...),例如 int... numbers。 1.…

Zsh 安装与配置

目录 1 环境配置 1.1 基本工具安装 1.2 安装 oh-my-zsh 1.3 从.bashrc中迁移配置(可选) 2 主题配置 2.1 内置主题 2.2 自定义主题 2.2.1 推荐主题 3 插件安装 3.1 推荐插件 3.1.1 zsh -autosuggestions 3.1.2 zsh-syntax-highlighting 3.2 启…

kubernetes中的微服务

目录 一 什么是微服务 二 微服务的类型 三 ipvs模式 3.1 ipvs模式配置方式 四 微服务类型详解 4.1 clusterip 4.2 ClusterIP中的特殊模式headless 4.3 nodeport 4.4 loadbalancer 4.5 metalLB 4.6 externalname 五 Ingress-nginx 5.1 ingress-nginx功能 5.2 部署…

【数据结构】1.顺序表

「前言」 🌈个人主页: 代码探秘者 🌈C语言专栏:C语言 🌈C专栏: C 🌈喜欢的诗句:天行健,君子以自强不息. 线性表 线性表(List):零个或多个数据元素的有限序列…

软考(网工)——数据通信基础

🕐信道特性 1️⃣概念 通信得目的就是传递信息。通信中产生和发送信息得一端叫信源,接受信息的一段叫信宿,信源和信宿之间的通信线路称为信道。 2️⃣信道带宽 W 模拟信道:Wf2-f1(f2 和 f1分别表示:信道…

树的中心——dfs

题目 代码 #include <bits/stdc.h> using namespace std; const int N 1e510, M N*2; int h[N], e[M], ne[M], idx; int n; int ans 2e9; bool st[N]; void add(int a, int b) // 添加一条边a->b {e[idx] b, ne[idx] h[a], h[a] idx ; } int dfs(int u) {int…

芯片记录一下

1、MC34063 电源管理DCDC 输入电压&#xff1a;-0.3~40V 输出电压&#xff1a;Vout1.25*&#xff08;1R2/R1&#xff09; 1.25V~40V

【报错解决】安装scikit-rebate包报错

scikit-rebate ReBATE是一套基于Relief的机器学习特征选择算法 报错信息 解决方案 conda install numpy scipy scikit-learnpip install skrebate依次运行以上两步&#xff0c;即可成功安装&#xff01;

如何实时监测你的光纤资源?

光纤资源作为重要的通信基础设施&#xff0c;实时监测光纤资源的状态是运营管理好光纤资源的重要手段&#xff0c;那常用的监测指标维度与方法有那些呢&#xff1f; 维度1&#xff1a;资源数量 资源数量主是建立资源的基础档案&#xff0c;掌握光缆的型号、路由&#xff1b;光…

健康推荐系统:SpringBoot技术实现

3系统分析 3.1可行性分析 通过对本基于智能推荐的卫生健康系统实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本基于智能推荐的卫生健康系统采用SSM框架&#…

python 位运算 笔记

起因&#xff0c; 目的: 位运算&#xff0c;令我头疼的地方。算法题里面也是经常见到。 位运算。 按位或&#xff0c;OR, | , 只要有一个为1&#xff0c; 结果就是1&#xff0c;否则为0按位异或&#xff0c;XOR, ^, 2个数不同&#xff0c;结果为1&#xff0c; 否则为0&#…

k8s jenkins 2.421动态创建slave

k8s jenkins 动态创建slave 简述使用jenkins动态slave的优势&#xff1a;制作jenkins-slave从节点jenkins-slave-latest:v1配置jenkins动态slave配置 Pod Template配置容器模板挂载卷 测试 简述 持续构建与发布是我们日常工作中必不可少的一个步骤&#xff0c;目前大多公司都采…

《OpenCV计算机视觉》—— 使用DNN模块实现图片风格迁移

文章目录 OpenCV中的DNN模块一、功能概述二、支持的模型格式三、基本使用方法四、DNN 模块的特点五、常见应用示例 示例&#xff1a;图片风格迁移 OpenCV中的DNN模块 OpenCV中的DNN&#xff08;Deep Neural Network&#xff09;模块是一个功能强大的工具&#xff0c;它允许开发…