opencv(三)边界填充、图像融合、图像阈值处理

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


一、边界填充

  • 边界填充就是将图片按一定的方法将图片的四周向外填充并将图片放大
  • 因为opencv中的颜色通道不是RGB而是BGR,所以我们要用到之前讲到的分割将颜色通道重新整合成RGB后再用matplotlib库将其画出
import cv2
import matplotlib.pyplot as plt
import numpy as np
# 导入图片
img = cv2.imread('cat.jpg')
img = img[200:600,200:700]
b,g,r = cv2.split(img)
img = cv2.merge((r,g,b))
top_size,bottom_size,left_size,right_size = (50,50,50,50)
# 边界填充
replicate = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv2.BORDER_REFLECT_101)
wrap = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv2.BORDER_WRAP)
constant = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv2.BORDER_CONSTANT)
# 分别展示看到不同的效果
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()
  • BORDER_REPLICATE : 复制法,也就是复制最边缘像素
  • BORDER_REFLECT:反射法,对感兴趣的图像中的像素在两边进行复制
  • BORDER_REFLECT_101:反射法,也就是仪最边缘像素为轴,对称
  • BORDER_WRAP:外包装法
  • BORDER_CONSTANT:常量法,常数值填充

各个方法效果展示如下:

在这里插入图片描述

二、图像的融合

  • cv2.resize(img,(长,高))
  • cv2.addWeighted(img1,alpha1,img2,alpha2,b)
    • alpha是权重,b为偏置项
    • 公式为img = a1 ∗ * img1 + a2 ∗ * img2 + b
    • 形成新的图像
  • 图像融合时一定要保持两张图片的大小一样
# 展示图片函数
import cv2
import numpy as np
def show_img(name,img_path):
    cv2.imshow(name,img_path)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
import cv2
import matplotlib.pyplot as plt
import numpy as np
import show_img		#该包为自己写的展示图片功能
cat = cv2.imread('cat.jpg')
dog = cv2.imread('dog.jpg')
# print(cat+dog)	#查看两张图片的大小(不一样大会报错提示)
cat = cv2.resize(cat,(889,500))	#调整两张图片大小一致(将大图片改小)
# 图像融合
add_img = cv2.addWeighted(cat,0.4,dog,0.6,0)
show_img.show_img('add',add_img)	#展示图片(可自己写展示图片那几行代码)
  • 最终将猫和狗分别按一定的比例将其融合到一起。

在这里插入图片描述

三、 图像阈值

  • ret,dst = cv2.threshold(src,thresh,maxval,type)
    • src:输入图,只能输入单通道图像,通常来说为灰度图
    • dst:输出图
    • thresh:阈值
    • maxval:当像素点超过了阈值(或者小于阈值,根据type来决定),所赋予的值
    • type:二值化操作的类型,包含一下五种类型:
      • cv2.THRESH_BINARY:超过阈值部分取maxval,否则为0
      • cv2.THRESH_BINARY_INV:上一个的反转
      • cv2.THRESH_TRUNC:大于阈值部分设为阈值,否则不变
      • cv2.THRESH_TOZERO:大于阈值部分不改变,否则为0
      • cv2.THRESH_TOZERO_INV:上一个的反转
import cv2
import show_img
import matplotlib.pyplot as plt
import numpy as np

cat = cv2.imread('../data/cat.jpg')
cat = cat[200:700,200:700,:]	#原图太大了,这里只展示部分效果
cat_gray = cv2.imread('../data/cat.jpg',cv2.IMREAD_GRAYSCALE) #变成灰色图
cat_gray = cat_gray[200:700,200:700]
# show_img.show_img('cat',cat)
#调整颜色通道
b,g,r = cv2.split(cat)
cat = cv2.merge((r,g,b))
#图像阈值处理
ret,thresh1 = cv2.threshold(cat_gray,127,255,cv2.THRESH_BINARY)
ret,thresh2 = cv2.threshold(cat_gray,127,255,cv2.THRESH_BINARY_INV)
ret,thresh3 = cv2.threshold(cat_gray,127,255,cv2.THRESH_TRUNC)
ret,thresh4 = cv2.threshold(cat_gray,127,255,cv2.THRESH_TOZERO)
ret,thresh5 = cv2.threshold(cat_gray,127,255,cv2.THRESH_TOZERO_INV)

titles = ['Original Image','BINARY','BINARY_INV','TRUNC','TOZERO','TOZERO_INV']
images = [cat,thresh1,thresh2,thresh3,thresh4,thresh5]
# 展示不同方法进行的不同处理
for i in range(6):
    plt.subplot(2,3,i+1),plt.imshow(images[i],'gray')
    plt.title(titles[i])
    plt.xticks([]),plt.yticks([])
plt.show()
  • 效果展示(别忘了0是黑255是白哦)
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_73044854/article/details/134652956
今日推荐