关于opencv的基础的学习

这几天跟着b站上的老师进行了opencv最基础操作的学习,接下来写一下自己学习到的内容。

(这个是b站上学习的链接,有兴趣的话可以看一下)https://www.bilibili.com/video/BV1PV411774y?p=9&share_source=copy_web

 这个是我用的照片


 

def cv_show(name,img):
    cv2.imshow(name, img)
    cv2.waitKey(0)           #  0代表按任意键退出   其他数字代表等待多少毫秒
    cv2.destroyAllWindows()   #   销毁所有窗口

首先定义了一下函数方便之后显示图像(不用一遍遍的敲) 

这里用的是imshow来展示的,如果是用print的话,会用矩阵分别输出该图片各个通道的值。比如下面这个例子。

img = cv2.imread('cat.jpg', cv2.IMREAD_GRAYSCALE)    #灰色图  cv2.IMREAD_GRAYSCALE第二参数表示读取类型
print(img)
cv_show('img2', img)

用灰度图举例,它所得的结果为:(取值范围在0--255之间)

[[10 10 10 ... 13 13 13]
 [10 10 10 ... 13 13 13]
 [10 10 10 ... 13 13 13]
 ...
 [14  7  6 ... 16  9 22]
 [40 18  3 ... 15 30 52]
 [63 28  0 ... 15 19 47]]


接下来是shape的运用,它显示的是图片高,宽,和有几个颜色通道

img = cv2.imread('cat.jpg')
print(img.shape)    #  h,w,c(几个颜色通道)

这是彩色图的运行结果: (296, 474, 3),这个是转化为灰度图的后的结果(296, 474)


保存图片:

# cv2.inwrite('名称',img)    保存

接下来是对图像的部分截取:

#截取部分图像数据
img=cv2.imread('cat.jpg')
cat=img[0:200,0:200]       #坐标范围
cv_show('cat',cat)

这个是所得到的图像,我们选定的像素点是高:0-200,宽:0-200


对颜色通道的操作:

首先是对颜色通道的提取:

#颜色通道提取
b,g,r=cv2.split(img)    #分离
print(b)


[[12 12 12 ... 11 11 11]
 [12 12 12 ... 11 11 11]
 [12 12 12 ... 11 11 11]
 ...
 [14  7  6 ...  7  2 15]
 [40 18  3 ...  6 23 45]
 [63 28  0 ...  6 12 40]]

代码段下面是所得到的B通道的参数。

接着是对颜色通道的组合:

img=cv2.merge((b,g,r))   #组合

只保留单色通道的图像:   B---0,G---1,R---2

#只保留R
cur_img =img.copy()
cur_img[:,:,0]=0        #B---0
cur_img[:,:,1]=0        #G---1
cv_show('R',cur_img)

#只保留B
cur_img =img.copy()
cur_img[:,:,1]=0        #G---1
cur_img[:,:,2]=0        #R---2
cv_show('B',cur_img)

#只保留R
cur_img =img.copy()
cur_img[:,:,0]=0        #B---0
cur_img[:,:,1]=0        #G---1
cv_show('R',cur_img)

我们来展示一下:这个是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)    #复制法

我们这里用了复制法(复制最边缘像素)举例,还有以下这些方法:
#BORDER_REFLECT     反射法,对感兴趣的图像中的像素在两边进行复制      dcba|abcd|dcba
#BORDER_REFLECT_101   反射法,以最边缘像素为轴,对称           dcb|abcd|cba
#BORDER_WRAP  外包装法        abcd|abcd|abcd
#BORDER_CONSTANT   常量法

以上这些方法都是用cv2.copyMakeBorder这个去进行操作的


我们也可以的对矩阵中的数值进行运算:

img_cat = cv2.imread('cat.jpg')
img_cat2 = img_cat + 10

shape值相同的话两张图片也可以相加,超过255的话,得到的数值会对256取余。

cv2.add(img_cat,img_cat2)
#没越界的话取自身,越界的话取255

这行代码也是相加,区别在于如果相加之后得到的数字大于255,它的值就会显示255。


 如果shape值不相同,可以先把他们的shape值转化为相同的,再进行运算操作:

#改变高和宽
img_dog = cv2.resize(img_dog,(474,296))
#shape输出的是高和宽,resize需要的是宽和高

我们这里需要注意一下。shape值是输出的是高和宽,resize所需要的是宽和高。

也可以将他们的宽和高成为按一定比列的形式:

res1 = cv2.resize(img,(0,0),fx=3,fy=1)
#高和宽成一定的比例

下面是两张图片进行融合:

img_cat = cv2.imread('cat.jpg')
img_dog = cv2.imread('dog.jpg')
res = cv2.addWeighted(img_cat,0.4,img_dog,0.6,0)
#所选的照片和每个照片所占的权重,最后的数字代表提升多少亮度

这是融合后的结果


 最后要说的是对视频的操作:

vc =cv2.VideoCapture('cat.mp4')        #对视频的截取
if vc.isOpened():         #检查是否能正确打开
    open,frame = vc.read()
else:
    open =False

while open:
    ret,frame =vc.read()
    if frame is None:
        break
    if ret == True:
        gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)   #转化成黑白色?
        cv2.imshow('result',gray)
        if cv2.waitKey(10) & 0xFF ==27:               #0xFF==27代表按退出键退出,waitKey表示等待多久退出
            break
vc.release()
cv2.destroyAllWindows()     #关闭所有窗口

if语句判断是否能够打开,如果不能打开,那么while语句中就直接终止,如果可以打开,我们这里是将视频转化为了黑白色,视频会按我们操作之后的进行播放,waitkey()中的数字代表等待多少秒之后关闭视频,0xFF==27是代表按esc键退出(可以根据按键的ASCII码值进行修改)。


以上就是本次博客的全部内容,有什么不对的地方欢迎大家的指正。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值