欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 游戏 > 视觉的边界填充、数值计算和腐蚀操作

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

2024/10/25 1:27:26 来源:https://blog.csdn.net/Mr_Happy_Li/article/details/142913521  浏览:    关键词:视觉的边界填充、数值计算和腐蚀操作

文章目录

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

一、边界填充

边界填充的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 npdef 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 npdef 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()

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

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

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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com