文章目录
- 一、边界填充
- 二、数值计算
- 三、图片融合
- 四、腐蚀操作
一、边界填充
边界填充的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()
腐蚀一次:
腐蚀两次:
腐蚀三次: