【初识OpenCV】(2)--图片修改、运算,边界填充以及阈值调整

OpenCV

OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习库,它主要用于实时图像处理和计算机视觉任务。

本篇所用图片数据:

链接:学习数据
提取码:dzvx

图片修改

1. 图片缩放

# 图片缩放
a = cv2.imread('GGbond.jpg')

a_new_1 = cv2.resize(a,(400,400)) #直接指定宽,高大小
# 或
a_new_2 = cv2.resize(a,dsize=None,fx=0.5,fy=0.5)# 指定x方向和y方向的缩放倍数

print(a.shape) #高 宽
cv2.imshow('a',a)
cv2.imshow('a_new_1',a_new_1)
cv2.imshow('a_new_2',a_new_2)
cv2.waitKey(10000)
cv2.destroyAllWindows()
------------
(1070, 1080, 3)

在这里插入图片描述

2. 图片打码

将需要打码的位置,用不同的像素点将其覆盖

import numpy as np
a = cv2.imread('GGbond.jpg')
a = cv2.resize(a,(400,400))
cv2.imshow('a',a)
a[150:350,150:350] = np.random.randint(0,256,(200,200,3)) #替换时,要注意两者范围要一样大
cv2.imshow('masaike',a)
cv2.waitKey(10000)
cv2.destroyAllWindows()

在这里插入图片描述

3. 图片组合

也可以理解为,图片替换,即将一张图片中的区域,覆盖在另一张图片上:

# 图片组合
a = cv2.imread("GGbond.jpg")
a = cv2.resize(a,(400,400))
b = cv2.imread("yifei.jpg")
b = cv2.resize(b,(400,400))

a[150:350,150:350] = b[150:350,150:350] #宽 高
cv2.imshow('a',a)
cv2.imshow('b',b)
cv2.waitKey(10000)
cv2.destroyAllWindows()

在这里插入图片描述

图像运算

对像素点的值进行加法运算:直接相加、add()方法相加和权重相加

1. 直接相加

  • 直接相加的过程,即是将图片中每个像素点的值都加上变量值:如c = a_new + 10,就是将a_new这个图片中的每个像素点值加10。但是,注意!!:当两个像素点之和超过255时,相加后的结果减去256,如a+b=260,像素值结果为260-256=4:
a = cv2.imread('GGbond.jpg')
a_new = cv2.resize(a,dsize=None,fx=0.5,fy=0.5)
c = a_new + 10
cv2.imshow('yuan',a_new)
cv2.imshow('tupian',c)
cv2.waitKey(10000)

在这里插入图片描述

  • 将对应区域的每个对应的像素点相加:
a = cv2.imread('GGbond.jpg')
b = cv2.imread('yifei.jpg')
a_new = cv2.resize(a,(400,400))
b_new = cv2.resize(b,(400,400))
c = a_new[50:300,50:300]+b_new[50:300,50:300]
cv2.imshow("a+b",c)
cv2.waitKey(10000)

在这里插入图片描述

2. add()方法相加

注意!!!:add方法的不同,当两个像素点之和超过255时,该位置数值为255,与直接相加不一样:

# add()加法运算
# 注意!!:当两个像素点之和超过255时,该位置数值为255
a = cv2.imread('GGbond.jpg')
b = cv2.imread('yifei.jpg')
a_new = cv2.resize(a,(400,400))
b_new = cv2.resize(b,(400,400))
c = cv2.add(a_new,b_new)
cv2.imshow('a+b',c)
cv2.waitKey(10000)

在这里插入图片描述

3. 权重相加

就是在计算两个图片的像素值之和时,考虑到每幅图的权重:

#图像加权运算
#就是在计算两个图片的像素值之和时,考虑到每幅图的权重
a = cv2.imread('GGbond.jpg')
b = cv2.imread('tt.jpg')
a_new = cv2.resize(a,(400,400))
b_new = cv2.resize(b,(400,400))

c = cv2.addWeighted(a_new,0.2,b_new,0.8,10) #0.2和0.8:分别表示每幅图所占的权重;10:图像的亮度值
cv2.imshow("addWeeighted",c)
cv2.waitKey(10000)
cv2.destroyAllWindows()

在这里插入图片描述

边界填充

将原始图片扩大,使用cv2.copyMakeBorder()函数,用于添加额外边界,参数中使用不同的方法,用不同的形式填充:

copyMakeBorder(src,top,bottom,left,right,borderType)
参数:
-- src:要扩充的原始图像
-- top,bottom,left,right:对应方向上扩充的宽度
-- borderType:定义要添加边框的类型,可以是以下得到一种:
    cv2.BORDER_CONSTANT:需要输入BGR值,用BGR值对应的颜色填充
    cv2.BORDER_REFLECT:以镜面反射的图像填充,类似fedcba/abcdef/fedcba
    cv2.BORDER_REFLECT101:和上面的一样,但是镜像交界处被删除了,类似fedcb/abcdef/edcba
    cv2.BORDER_REPLICATE:用最边界的像素值代替,类似aaaa/abcdef/ffff
    cv2.BORDER_WRAP:左右两边替换,上下替换
a = cv2.imread('yifei.jpg')
yf = cv2.resize(a,(400,400))
top,bottom,left,right = 50,50,50,50

constant = cv2.copyMakeBorder(yf,top,bottom,left,right,borderType=cv2.BORDER_CONSTANT,value=(0,255,0))
reflect = cv2.copyMakeBorder(yf,top,bottom,left,right,borderType=cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(yf,top,bottom,left,right,borderType=cv2.BORDER_REFLECT101)
replicate = cv2.copyMakeBorder(yf,top,bottom,left,right,borderType=cv2.BORDER_REPLICATE)
wrap = cv2.copyMakeBorder(yf,top,bottom,left,right,borderType=cv2.BORDER_WRAP)

cv2.imshow('yuantu',yf)
cv2.waitKey(10000)
cv2.imshow('constant',constant)
cv2.waitKey(10000)
cv2.imshow('reflect',reflect)
cv2.waitKey(10000)
cv2.destroyAllWindows()
cv2.imshow('reflect101',reflect101)
cv2.waitKey(10000)
cv2.imshow('replicate',replicate)
cv2.waitKey(10000)
cv2.imshow('wrap',wrap)
cv2.waitKey(10000)

在这里插入图片描述

在这里插入图片描述

阈值调整

设置像素点阈值,改变图片颜色通道,适用于将图片二值化,cv2.threshold()方法设定阈值处理图像,给图像设定一个范围,高于设定值的像素值为255,低于设定值的,像素值为0:

cv2.threshold()方法返回两个参数:阈值与调整后图片

a = cv2.imread('yifei.jpg',0)
image = cv2.resize(a,(400,400))

#ret就是实际设定的阈值,此处ret为175
ret,binary = cv2.threshold(image,175,255,cv2.THRESH_BINARY)
ret1,binaryinv = cv2.threshold(image,175,255,cv2.THRESH_BINARY_INV)
ret2,trunc = cv2.threshold(image,175,255,cv2.THRESH_TRUNC)
ret3,tozero = cv2.threshold(image,175,255,cv2.THRESH_TOZERO)
ret4,tozeroinv = cv2.threshold(image,175,255,cv2.THRESH_TOZERO_INV)

cv2.imshow('original',image)
cv2.waitKey(0)
cv2.imshow('binary',binary)
cv2.waitKey(0)
cv2.imshow('binaryinv',binaryinv)
cv2.waitKey(0)
cv2.imshow('trunc',trunc)
cv2.waitKey(0)
cv2.imshow('tozero',tozero)
cv2.waitKey(0)
cv2.imshow('tozeroinv',tozeroinv)
cv2.waitKey(0)

在这里插入图片描述

在这里插入图片描述

总结

本篇介绍了:

  1. 图片的修改:缩放、打码、组合。
  2. 图片的运算:其中值得注意的是。
    1. 直接相加:当两个像素点之和超过255时,相加后的结果减去256。
    2. add()方法:当两个像素点之和超过255时,该位置数值为255。
    3. 权重相加:将图片重合,给重合图片设置权重。
  3. 边界填充:将原始图片扩大,使用cv2.copyMakeBorder()函数。
  4. 阈值调整:范围改变图片的像素值,适用于将图片二值化,cv2.threshold()方法设定阈值处理图像,给图像设定一个范围,高于设定值的像素值为255,低于设定值的,像素值为0。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值