😊😊😊欢迎来到本博客😊😊😊本次博客内容将继续讲解关于计算机视觉领域的相关知识🎉作者简介:⭐️⭐️⭐️目前地学博士生在读。📝目前更新:🌟🌟🌟目前已经更新了关于网络爬虫的相关知识、机器学习的相关知识、目前正在更新深度学习的相关内容。💛💛💛本文摘要💛💛💛
本文我们将根据计算机视觉相关知识完成批量化图像拼接操作
🌟提出问题
可能有好多同学在看到题目之后会觉得本篇博客是利用OPENCV中的SIFT、SURF或ORB等算法从图像中提取关键点和描述符进行特征匹配,然后拼接图像的操作。本文分享的和这个有一些差别,想要做的就是两个基本上不相关的图像进行拼接,具体如下:可以看出这两幅图像中有多余的白色区域,还有重复的图头区域,如果按照SIFT进行图像特征匹配然后完成拼接的化,肯定是图像的图头匹配度最高,然后图像重叠了,那就出现问题了。我们想要的是这两个图像要按照深度的顺序进行排序,将第二个图头去除,然后进行匹配。这个过程就有两个非常重要的点,一是去除白色边界;二是将第二个图头去除然后进行两个图像的拼接。
🌟去除白色边界
这里的思路是通过RGB图像转换为灰度图像,然后利用阈值将白色边缘部分卡掉。
image1 = cv2.imread(batch_files[0])if image1 isNone:print(f"无法读取图像: {batch_files[0]}")continue gray1 = cv2.cvtColor(image1, cv2.COLOR_BGR2GRAY) _, thresh1 = cv2.threshold(gray1,250,255, cv2.THRESH_BINARY_INV) contours1, _ = cv2.findContours(thresh1, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) x1, y1, w1, h1 = cv2.boundingRect(max(contours1, key=cv2.contourArea)) image1 = image1[y1:y1 + h1, x1:x1 + w1]对应的代码块如上,首先对图像进行读取,如果没有顺利读取,那将显示无法读取图像。然后转换为灰度值,通过阈值分割的方法将白色区域找到,然后找到图像中的边缘信息,最后将图像进行提取。
🌟去除图头
这里我的思路是找到图像中图头固定的像素距离,然后去切除掉这部分图像。具体代码如下:
batch_result = image1# 遍历并处理剩余的图像forfilein batch_files[1:]: image = cv2.imread(file)if image isNone:print(f"无法读取图像: {file}")continue gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) _, thresh = cv2.threshold(gray,250,255, cv2.THRESH_BINARY_INV) contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) x, y, w, h = cv2.boundingRect(max(contours, key=cv2.contourArea)) image = image[y:y + h, x:x + w]# 假设图头高度为固定值,这里假设为800像素,可根据实际情况调整 image = image[800:,:]# 检查图像宽度是否一致,如果不一致进行调整if batch_result.shape[1]!= image.shape[1]:# 这里简单地将图像缩放到和 result 相同的宽度 image = cv2.resize(image,(batch_result.shape[1], image.shape[0])) batch_result = cv2.vconcat([batch_result, image]) batch_results.append(batch_result)最终一个很重要的点就是保持所有的图像的宽度要一致,要不然会报错。
🌟效果展示
最终完成batch_size的图像拼接,然后效果如下:一点小技巧的分享!!!
🔎支持:🎁🎁🎁谢谢各位支持!