有趣的Python OpenCV教程学习(上)_学术菜鸟小晨的博客-程序员宅基地

技术标签: opencv  Python  

 

前置环境:

Windows:

pip install numpy
pip install matplotlib

 Linux:

pip3 install numpy 
pip3 install matplotlib 

 

1.读取图像转化成灰度图。

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('dog.jpg',cv2.IMREAD_GRAYSCALE)
cv2.imshow('image',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

cv2.imwrite('doggray.jpg',img)#保存

1.5  进阶! 批量读取图像转化成灰度图再批量保存。

可用于使用opencv批量处理图片并进行保存的通用代码。

# coding: utf-8
import cv2
import numpy as np
import os

test_dir = '/home/ycc/opencv/test/'#测试图片
save_dir = '/home/ycc/opencv/out/'#保存图片

pics = os.listdir(test_dir)#获取测试文件夹内所有图片列表

for im in pics:#循环读取图片列表
    #print(im)#可看出im是带.jpg的图片名
    img = os.path.join(test_dir,im)#获取图片完整路径
    #print(img)
    tu = cv2.imread(img)#读取图片
    #print(tu)#可看出tu是图像矩阵
    dst = cv2.cvtColor(tu,cv2.COLOR_BGR2GRAY)#转灰度
    cv2.imwrite(os.path.join(save_dir,im),dst)#用原始图像名im保存转换后的图片

2.读取视频转化成灰度视频。

import numpy as np
import cv2

cap = cv2.VideoCapture('vtest.avi')

while(True):
    ret,frame = cap.read()
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    
    cv2.imshow('frame',frame)
    cv2.imshow('frame',gray)
    if cv2.waitKey(1) & 0xFF == ord('q'):#按q键退出
        break

cap.release()
cv2.destoryAllWindows()

2.5 进阶!读取视频转化成灰度视频并保存。

可用于使用opencv处理完视频 进行保存的通用代码。

import numpy as np
import cv2

cap = cv2.VideoCapture('vtest.avi')
fps = int(cap.get(cv2.CAP_PROP_FPS))
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fourcc = cv2.VideoWriter_fourcc(*'XVID')
videoWriter = cv2.VideoWriter('11.avi', fourcc, int(fps), (int(width),int(height)),False)

while cap.isOpened():
    ret,frame = cap.read()
    if ret is True:
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        videoWriter.write(gray)
        cv2.imshow('frame',gray)

    if cv2.waitKey(1) & 0xFF == ord('q'):#按q键退出
        break

cap.release()
videoWriter.release()
cv2.destoryAllWindows()

3.在图像上绘制和写字。

import numpy as np
import cv2

img = cv2.imread('dog.jpg',cv2.IMREAD_COLOR)

cv2.line(img,(130,180),(130,350),(0,255,255),45)#cv2.line()参数:图片,开始坐标,结束坐标,颜色(bgr),线条粗细。
cv2.rectangle(img,(15,25),(250,150),(0,0,255),15)#cv2.rectangle()参数: 图像,左上角坐标,右下角坐标,颜色, 线条粗细。
cv2.circle(img,(130,180),55,(0,255,0),-1)#cv2.circle()参数:图像,圆心,半径,颜色,粗细为-1(填充)。


font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(img,'OpenCV!',(0,100),font,2,(200,255,155),5)#cv2.putText()参数:图像,显示字符,左上角坐标,定义字体,字体大小,颜色,字体粗细


cv2.imshow('image',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

4.图像混合。

import cv2
import numpy as np

# Load two images
img1 = cv2.imread('1.jpeg')
img2 = cv2.imread('2.png')

# I want to put logo on top-left corner, So I create a ROI
rows,cols,channels = img2.shape
roi = img1[0:rows, 0:cols ]

# Now create a mask of logo and create its inverse mask
img2gray = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)

# add a threshold
ret, mask = cv2.threshold(img2gray, 220, 255, cv2.THRESH_BINARY_INV)

mask_inv = cv2.bitwise_not(mask)

# Now black-out the area of logo in ROI
img1_bg = cv2.bitwise_and(roi,roi,mask = mask_inv)

# Take only region of logo from logo image.
img2_fg = cv2.bitwise_and(img2,img2,mask = mask)

dst = cv2.add(img1_bg,img2_fg)
img1[0:rows, 0:cols ] = dst

cv2.imshow('res',img1)
cv2.imwrite('xian2.jpg',img1)
cv2.waitKey(0)
cv2.destroyAllWindows()

就用上面代码解决这个问题吧!


ret, mask = cv2.threshold(img2gray, 220, 255, cv2.THRESH_BINARY_INV)
#cv2.threshold()参数:图像,【其中220是阀值,所有低于220的将会转化为0(黑色),高于220的将会转化为1(白色)】,最大值,阀值类型。

自行调节阀值可达到以下效果。

 

5.阀值进阶。

import cv2
import numpy as np

img = cv2.imread('bookpage.jpg')
retval, threshold = cv2.threshold(img, 10, 255, cv2.THRESH_BINARY)
cv2.imshow('original',img)
cv2.imshow('threshold',threshold)
cv2.waitKey(0)
cv2.destroyAllWindows()
原图地址:https://pythonprogramming.net/static/images/opencv/bookpage.jpg

 

import cv2
import numpy as np

img = cv2.imread('bookpage.jpg')
grayscaled = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
retval, threshold = cv2.threshold(grayscaled, 10, 255, cv2.THRESH_BINARY)
th = cv2.adaptiveThreshold(grayscaled, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 115, 1)#自适应调节阀值
cv2.imshow('original',img)
cv2.imshow('Adaptive threshold',th)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

6.Canny边缘检测。

import cv2
import numpy as np

cap = cv2.VideoCapture('vtest.avi')

while(1):

    _, frame = cap.read()
    cv2.imshow('Original',frame)
    edges = cv2.Canny(frame,100,200)
    cv2.imshow('Edges',edges)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cv2.destroyAllWindows()
cap.release()

 

 

 

 

参考:https://www.jianshu.com/p/91f5bce4420d

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_34717531/article/details/107402545

智能推荐

第六、七章小结 (2017-08-28 00:49:51)_不管风雨有多少丶的博客-程序员宅基地

第六章 条件处理AND、OR、XOR、NOT和TEST指令被称为按位指令(bitwise instructions),因为它们的操作都是位(bit)级的。源操作数中的每一位都与目标操作数的相同位进行匹配:l 若两个输入位都是1,则AND指令结果为1。l 若至少又一个输入位为1,则OR指令结果为1。l 若两个输入位不同,则XOR指令结果为1。l TEST指令对目的操作数执行隐含的AND操作...

输入输出_南春北秋的博客-程序员宅基地

输出函数字符输出函数C语言无I/O语句,借助函数实现 #include <stdio.h> 字符输出函数 putchar();格式输出函数printf(“格式控制串”,输出表) 格式符 说明 i,d 十进制无符号整数 x,X 十六进制无符号整数 o 八进制无符号整数 u 无符号十进制整数 c 单一字符 s 字符串 e,E 指数形

FastAPI中Jinjia2使用_欲求新知的博客-程序员宅基地_fastapi

FastAPI中Jinjia2使用简介Jinja2 是一个现代的,设计者友好的,仿照 Django 模板的 Python 模板语言。 它速度快,被广泛使用,并且提供了可选的沙箱模板执行环境保证安全。安装和初次使用安装pip install Jinjia2pip install aiofiles # 适用于FastAPI初次使用Python代码from fastapi import FastAPI, Requestfrom fastapi.templating impor

计算机网络技术第四版王协瑞答案,计算机网络技术 王协瑞_最上川灵感大王的博客-程序员宅基地

p&gt; 这本由王协瑞主编的《计算机网络技术(第2版计算机及应用专业)》共分九章:第1章计算机网络概述讲述计算机网络的基本概念;第2章数据通信基础主要介绍与计算机网络有关的数据通信基本知识,包括数据的基本概念、数据的传输方式、交换技术和差错检验等内容;第3章计算机网络技术基础主要介绍网络结构的基本知识、ISO/OSI参考模型及各层的主要功能和协议、TCP/IP网络模型和协议以及常见的网络类型;第...

第二节,Springboot自定义配置文件_dency-程序员宅基地

1、配置文件SpringBoot使用一个全局的配置文件,配置文件名是固定的;•application.properties•application.yml 配置文件的作用:修改SpringBoot自动配置的默认值;SpringBoot在底层都给我们自动配置好; YAML(YAML Ain't Markup Language)​ YAML A Markup Langu...

【Docker】Docker三剑客实践之部署集群_weixin_33711647的博客-程序员宅基地

作者:不洗碗工作室 - Marklux出处:marklux.cn/blog/55版权归作者所有,转载请注明出处前言DOCKER技术在推出后掀起了一阵容器化技术的热潮,容器化使得服务的部署变得极其简易,这为微服务和分布式计算提供了很大的便利。为了把容器化技术的优点发挥到极致,docker公司先后推出了三大技术:docker-machine,docker-compose,docker-swar...

随便推点

ubuntu15.04 GitLab下载安装配置_chimu2021的博客-程序员宅基地

最近研究SpringCloud,代码一般都托管到GitGub上,偶尔也用码云。但是自己想搭一套代码管理系统,于是准备在电脑的ubuntu虚拟机中搭建gitlab,整个过程花了一天多的时间,这里记录一下安装和使用遇到的一些问题。Ubuntu版本问题我的Ubuntu版本是15.04,版本...

【7】nagios从零学习使用 - nrpe插件使用_weixin_34191845的博客-程序员宅基地

使用nrpe插件来监控主机,被监控主机安装nagios-plugins、nrpe (需要gcc、openssl-devel、xinetd):Useradd nagiosPasswd nagios安装插件 nagios-plugins-1.x./configure --prefix=/usr/local/nagiosmake &amp;&amp; make instal...

计算思维与计算机导论在线阅读,计算思维与计算机导论.pdf_棘树的博客-程序员宅基地

计算思维与计算机导论,计算思维导论,计算思维导论pdf,计算思维导论ppt,计算思维导论课件,计算思维导论陈国良,计算机系统导论,计算机思维导论,北大计算机系统导论,计算机理论导论第 36 卷  第 4 期 计 算 机 科 学 Vol . 36 No...

esp32 接摄像头_一台交换机到底能带多少摄像头_weixin_39907311的博客-程序员宅基地

有些人一直认为交换机有多少口,就能带多少摄像头。这种说法是错误的,交换机带摄像头的数量与设备的码流和功率密不可分。一,从供电功率上来分析。首先说一下POE交换机,在不考虑数据交换的情况下,要看POE交换机的功率。目前市场上流行的poe交换机有IEEE802.3af和IEEE802.3at标准的,分别定义了15.4 W和30W的供电功率,由于实际传输中。存在损耗所以实际供电功率为13W和25W。同时...

Spring Boot自动配置实现原理_你好,我们在哪里见过啊!-程序员宅基地

我们在使用Spring Boot构建Java Web项目的时候,实现起来非常的简单,那么SpringBoot是如何做到看似简单,却能够实现我们之前使用SSM或者SSH结合复杂配置实现的功能的呢?我们在看Spring Boot的介绍的时候,常看到下面一段话:Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程。该框架使...

XStream 组件漏洞修复_悟●禅●酒的专栏-程序员宅基地_xstream漏洞修复

风险描述XStream 是Java 类库中的常用组件,可将Java 对象序列化为XML,反之可将Java 对象和XML 文档相互转换。XStream 官方发布安全公告,披露多个反序列化漏洞,包括:1、拒绝服务漏洞(CVE-2021-21341/21348)攻击者可利用该漏洞操纵已处理的输入流并替换或注入对象,执行恶意正则表达式的计算,从而造成拒绝服务攻击。2、服务端请求伪造漏洞(CVE-2021-21342/21349)攻击者可利用该漏洞操纵已处理的输入流并替换或注入对象,从而伪造服务端请求。

推荐文章

热门文章

相关标签