python+opencv笔记(2)——边缘填充

摘要:
左侧图像的上下填充边界的长度:aaaa | abcdefg | ggggg BORDER_ REFLECT:
python+opencv之边缘填充 一、边缘填充

相信很多喜欢玩电脑的小伙伴,遇到过这种情况:有时候换电脑壁纸的时候,原本一张很好看完整的图片,换成电脑壁纸就是一个不完整或者由很多重复的图片组成的壁纸。其实这里就有填充的出现。

边缘填充:因为对于图像的卷积操作,最边缘的像素一般无法处理,所以卷积核中心到不了最边缘像素。这就需要先将图像的边界填充,再根据不同的填充算法进行卷积操作,得到的新图像就是填充后的图像。

二、边缘填充函数原型

函数原型:cv2.copyMakeBorder(src,top, bottom, left, right ,borderType,value)

src:需要填充的图像

top:图像上面填充边界的长度

bottom:图像上下面填充边界的长度

left:图像左面填充边界的长度

right :图像右面填充边界的长度

borderType:边界的类型

BORDER_REPLICATE:复制法,即复制最边缘的像素。例如:aaaa|abcdefg|ggggg

BORDER_REFLECT:反射法,即以最边缘的像素为对称轴。例如:fedcba|abcdefg|gfedec

BORDER_REFLECT_101:反射法,也是最边缘的像素为对称轴,但与BORDER_REFLECT有区别。例如:fedcb|abcdefg|fedec

BORDER_WRAP:外包装法,即以图像的左边界与右边界相连,上下边界相连。例如:cdefgh|abcdefgh|abcdefg

BORDER_CONSTANT:常量法。

如果这里还有不明白的地方,我们可以跟着下面的代码和效果图对比,理解每个方法的作用。

value:填充的边界颜色,通常用于常量法填充中。

三、实现代码及解释

1、读取图像及显示图像代码

 1 #所需要的库
 2 import cv2 as cv
 3 import matplotlib.pyplot as plt
 4 import numpy as np
 5 
 6 #读取图片cv2.imread("图片路径")
 7 img=cv.imread('lufei.jpg')
 8 
 9 #显示图像函数
10 def cv_show(name,img):
11     cv.imshow(name,img)
12     cv.waitKey(0)
13     cv.destroyAllWindows()

关于图像的读取、显示等基本操作,具体查看老猫上一篇博客。

2、核心代码

 1 #各个边界需要填充的值
 2 top_size,bottom_size,left_size,right_size=(50,50,50,50)
 3 #复制法
 4 replicate=cv.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv.BORDER_REPLICATE)
 5 #反射法
 6 reflect=cv.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,cv.BORDER_REFLECT)
 7 reflect101=cv.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,cv.BORDER_REFLECT_101)
 8 #外包装法
 9 wrap=cv.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,cv.BORDER_WRAP)
10 #常量法,常数值填充
11 constant=cv.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,cv.BORDER_CONSTANT,value=(0,255,0))
 1 img1=img.copy()
 2 #在各个图像上添加相应的文本
 3 cv.putText(img1,"original",(0,50),cv.FONT_HERSHEY_COMPLEX,2,(0,250,0),4,8)
 4 cv.putText(replicate,"replicate",(0,50),cv.FONT_HERSHEY_COMPLEX,2,(0,250,0),4,8)
 5 cv.putText(reflect,"reflect",(0,50),cv.FONT_HERSHEY_COMPLEX,2,(0,250,0),4,8)
 6 cv.putText(reflect101,"reflect101",(0,50),cv.FONT_HERSHEY_COMPLEX,2,(0,250,0),4,8)
 7 cv.putText(wrap,"wrap",(0,50),cv.FONT_HERSHEY_COMPLEX,2,(0,250,0),4,8)
 8 cv.putText(constant,"constant",(0,50),cv.FONT_HERSHEY_COMPLEX,2,(0,250,0),4,8)
 9 
10 #显示图像
11 cv_show("original",img1)
12 cv_show("replicate",replicate)
13 cv_show("reflect",reflect)
14 cv_show("reflect101",reflect101)
15 cv_show("wrap",wrap)
16 cv_show("constant",constant)

3、效果图对比

为了对比填充前后的图像,博主这里上传的截图,没有进行等比缩放,全是原始大小。

根据效果图可以很明显的看出,原图和填充后的图的大小是不一样的。

python+opencv笔记(2)——边缘填充第1张python+opencv笔记(2)——边缘填充第2张

python+opencv笔记(2)——边缘填充第3张python+opencv笔记(2)——边缘填充第4张

python+opencv笔记(2)——边缘填充第5张python+opencv笔记(2)——边缘填充第6张

4、细节经验分享

 (1)老猫在编写关于图像边缘填充的代码过程中,是使用每一个窗口对应一个图像的方法显示图像,这样编写的代码,就无法很快地直接对比出各个图像之间的区别。

为了能快速对比出各个方法得出的图像的区别,可以使用np.vstack()或者np.hstack()对比,将图像放在同一个窗口。

1 rec=np.hstack((replicate,reflect))
2 cv_show("replicate_reflect",rec)

python+opencv笔记(2)——边缘填充第7张

 注意:

问题A:使用np.vstack()或者np.hstack()函数时,图像的大小必须一致,不然会报错。

解决A:若不知道两张图像的大小,可以使用shape来查看。

例如:

python+opencv笔记(2)——边缘填充第8张

 

问题B.使用np.vstack()或者np.hstack()函数时,可能会出现图像显示不完全情况。

解决B:这是因为窗口的大小是根据屏幕的大小来定的,若窗口的长度或者高度超过电脑屏幕的大小,这会以电脑的长度或者高度来显示。

例如:

 python+opencv笔记(2)——边缘填充第9张

(2)可以用画布显示所有图像进行对比

代码:

1 plt.subplot(231),plt.imshow(img,"gray"),plt.title("original")
2 plt.subplot(232),plt.imshow(replicate,"gray"),plt.title("replicate")
3 plt.subplot(233),plt.imshow(reflect,"gray"),plt.title("reflect")
4 plt.subplot(234),plt.imshow(reflect101,"gray"),plt.title("reflect101")
5 plt.subplot(235),plt.imshow(wrap,"gray"),plt.title("wrap")
6 plt.subplot(236),plt.imshow(constant,"gray"),plt.title("constant")
7 plt.show()

 效果图:

python+opencv笔记(2)——边缘填充第10张

 

免责声明:文章转载自《python+opencv笔记(2)——边缘填充》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇font-style字体设置深入分析游戏设计的8条原则下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

webstorm中配置过visualsvn,后面做更改要更换authentication realm的解决办法

找这个找了好久,一直改不过来,终于找到了解决办法 首先,在提交代码时提示: 但是我的authentication realm已经时这个了,并且账号和密码也改了,所以要更改authentication realm。 使用的时候要安装TortoiseSVN,安装好之后数遍右键会提示相关的操作;在空白处右键,选择TortoiseSVN-重新定位,会弹出下面这个...

node系列:学会node调试

前言 该文章来自于chh大佬的投稿,为他打call 为何需要node调试? 熟练使用node调试能让你在日常开发中更快的定位问题所在的代码,提高开发效率 如何进行node调试? node调试方式多样,本篇只介绍笔者最熟悉的使用vscode的调试方式 使用vscode运行 vscode左侧共有五个按钮,第四个按钮即为"运行"按钮,假如你的根目录没有.vs...

关于webpack模块打包工具

一、与webpack类似的工具有那些?为什么最终选择webpack?  打包工具: webpack rollup parcel  理由: webpack适用于大型复杂的前端站点构建 rollup适用于基础库的打包,如vue、react parcel适用于简单的实验性项目,他可以满足低门槛的快速看到效果。     由于parcel在打包过程中给出的调...

kestrel Server的源码分析

今天这一篇博客讲的是.net core 自带的kestrel server,当你开发微服务k8s部署在linux环境下,一般默认开启这个高性能服务,如果大家之前看过我的owin katana的博客,会发现.net core 的好多实现在之前.net standard 的版本已经实现过了,当时开发的asp.net 程序与IIS紧紧耦合在一起,后来的微软团队意...

用Python获取本机网卡IP数据包

这几天用到了raw socket,用python写了些demo程序,这里记录下,也方便我以后查阅。 首先我们看一个简单的sniffer程序: #! /usr/bin/python # code for linux import socket #s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket...

STM32程序中使用printf打印中文字符乱码

STM32程序printf打印中文字符到串口出现乱码解决方法 作者 : 李剀 出处 : https://blog.csdn.net/Kevin_8_Lee/ 或者 https://www.cnblogs.com/kevin-nancy/ 欢迎转载,但也请保留上面这段声明。 谢谢! (以上两个链接均是我个人的博客,只是在不同的平台上面) 前言: 相信...