python数字图像处理基础(二)——图像基本操作、滑动条、鼠标操作

目录

    • 图像读取与显示
    • 读取视频与查看属性
    • 图像保存
    • 保存视频
    • 图像属性打印
    • 遍历图像的所有像素点的RGB值
    • 图像边界填充
    • 数值计算
    • 图像大小变化
    • 图像窗口滑动条的创建和使用
    • 鼠标操作

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

图像读取与显示

  • 图像读取

cv2.MREAD_COLOR: 彩色图像 或用1

cv2.IMREAD_GRAYSCALE:灰度图像 或用0

img = cv2.imread(‘cat.jpg’, cv2.IMREAD_GRAYSCALE)

等同于: img = cv2.imread(‘cat.jpg’, 0)

python">img = cv2.imread("D:/OpenCV_code/bank_card/temp.jpg")
# 通过这样指定其他路径的文件图像
  • 图像的显示,也可以创建多个窗口

cv2.imshow(‘img’, img)

  • 等待时间,毫秒级,0表示任意键终止

cv2.waitKey(0)

cv2.destroyAllWindows()

  • 连接多张图片

横着连:res = np.hstack(img1,img2,img3)

竖着连:res = np.vstack(img1,img2,img3)

  • 截取部分图像数据

img = cv2.imread(‘cat.jpg’)

cat = img[0:200, 0:200] #切片


读取视频与查看属性

cv2.VideoCapture(source)可以捕获摄像头,用数字来控制不同的设备,例如0,1;如果是视频文件,直接制定好路径即可

source 取值功能
0获取笔记本电脑本机摄像头
文件及路径获取视频文件
python">vc = cv2.VideoCapture('test.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.cvColor(frame, cv2.COLOR_BGR2GRAY)`
		cv2.imshow('result', gray)`
		if cv2.waitKey(10) & OxFF == 27:   #等待一段时间或按ESC`
			break`
vc.release`
cv2.destroyAllWindows()`
python">import cv2
 
cap = cv2.VideoCapture('Forest.mp4')
while cap.isOpened():
    ret, frame = cap.read()
    # 调整窗口大小
    # 0可调大小,注意:窗口名必须imshow里面的一窗口名一直                   
    cv2.namedWindow("frame", 0)  
    # 设置长和宽                   
    cv2.resizeWindow("frame", 1600, 900)  
     #运行显示                  
    cv2.imshow('frame', frame)
    #q键退出运行窗口【英文状态下】
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
 
    cap.release()
cv2.destroyAllWindows()

此外可以通过cv2.VideoCapture.get()和.set()查看、更改视频属性。

OpenCV-Python设置曝光、对比度等参数_南沐ヾ的博客-CSDN博客_opencv python 对比度


图像保存

cv2.imwrite(‘mycat.png’, img)

区分:

img2 = img1 img2和img1指定同一幅图像
img2 = img1.copy() img2和img1指定两幅相同的图像


保存视频

cv2.VideoWriter()

VideoWriter(filename, fourcc, fps, frameSize[, isColor]) ->

  • 第一个参数是要保存的文件的路径
  • fourcc 指定编码器
  • fps 要保存的视频的帧率
  • frameSize 要保存的文件的画面尺寸
  • isColor 指示是黑白画面还是彩色的画面
python">import numpy as np
import cv2
 
cap = cv2.VideoCapture(0)
 
fourcc = cv2.VideoWriter_fourcc(*'XVID')
 
out = cv2.VideoWriter('testwrite.avi',fourcc, 20.0, (1920,1080),True)
 
while(cap.isOpened()):
    ret, frame = cap.read()
    if ret==True:
 
        cv2.imshow('frame',frame)
        out.write(frame)
 
        if cv2.waitKey(10) & 0xFF == ord('q'):
            break
    else:
        break
 
cap.release()
out.release()
cv2.destroyAllWindows()

图像属性打印

  • img.shape --> (h,w,c) c,表示层数,3为彩图,在opencv中为BGR;灰度图只有(h,w)

  • type(img) --> numpy.ndarray

  • img.size --> 像素点个数

  • img.dtype --> dtype(‘uint8’) 数据类型

  • 图像颜色通道提取

python">b,g,r = cv2.split(img)
b   --> b通道像素点矩阵值
b.shape  --> (h,w)   #三个通道相同(一张图)
#只保留R通道,显示红色
cur_img = img.copy()
cur_img[:,:,0] = 0
cur_img[:,:,1] = 0   #提取R单通道,故按顺序BGR把0(代表B)、1(代表G)置为0

cv_show('R',cur_img)
  • cv2.split()和cv2.merge()函数

cv2.split():分离图像的BGR,cv2.merge():根据BGR值重新融合出图像


遍历图像的所有像素点的RGB值

python">import cv2
import numpy as np

np.set_printoptions(threshold=np.nan)    # 这里多加一行代码,避免控制台输出省略号的问题

pic_path = "../01.jpg"   # 图片路径
img = cv2.imread(pic_path)
for x in range(img.shape[0]):   # 图片的高
	for y in range(img.shape[1]):   # 图片的宽
		px = img[x,y]
		print(px)    # 这样就能得到每个点的bgr值


图像边界填充

先指定图像上下左右填充的值大小

top_size,bottom_size,left_size,right_size = (50,50,50,50)

函数

cv2.copyMakeBorder(src,top, bottom, left, right ,borderType,value)

  • src:原图像

  • top,bottem,left,right:分别表示四个方向上边界的长度

  • borderType:边界的类型 以abcdef为例

    cv2.BORDER_CONSTANT 固定值填充,value为颜色值
    cv2.BORDER_REFLECT 边界元素的镜像,填充的边界与原图像边界对称,成镜像,fedcba
    cv2.BORDER_DEFAULT 边界元素的镜像,填充的边界与原图像边界(忽略第一个元素)对称,成镜像,gfedcb
    cv2.BORDER_REPLICATE 用原图像边界的第一个元素进行填充,aaaaa
    cv2.BORDER_WRAP 取上下左右相反的镜像

  • value:如果borderType为cv2.BORDER_CONSTANT时需要填充的常数值

举例:

python">`import cv2`
`import numpy as np`
`import matplotlib.pyplot as plt`

`img = cv2.imread('sugar.jpg')`

`##画图`
`def draw_img(i,img,title):`
    `plt.subplot(2,3,i)`
    `plt.imshow(img)`
    `plt.axis('off')`
    `plt.title(title)`
    
`##BGR转RGB`
`img_rgb = cv2.cvtColor(img_rgb,cv2.COLOR_BGR2RGB)`

`##边界填充`
`constant = cv2.copyMakeBorder(img_rgb, 100, 100, 100, 100, cv2.BORDER_CONSTANT, value=[255, 0, 0])`

`reflect = cv2.copyMakeBorder(img_rgb, 100, 100, 100, 100, cv2.BORDER_REFLECT)`

`default = cv2.copyMakeBorder(img_rgb, 100, 100, 100, 100, cv2.BORDER_DEFAULT)`

`replicate = cv2.copyMakeBorder(img_rgb, 100, 100, 100, 100, cv2.BORDER_REPLICATE)`

`wrap = cv2.copyMakeBorder(img_rgb, 100, 100, 100, 100, cv2.BORDER_WRAP)`

`##画图`
`draw_img(1,img_rgb,'original')`
`draw_img(2,constant,'constant')`
`draw_img(3,reflect,'reflect')`
`draw_img(4,default,'default')`
`draw_img(5,replicate,'replicate')`
`draw_img(6,wrap,'wrap')`
`plt.show()`

在这里插入图片描述


数值计算

img1 = img1 + 10 :
img的G、B、R三个图层的每个像素点的亮度都增加10

也可以是两个图相加
img1+img2
对应相同位置像素点数值相加,范围仍是0-255,超过255取余数

add(img1,img2)
两图对应的相同位置像素点数值相加,结果大于等于255就取255,小于255就取数值相加的值本身


图像大小变化

img1 = cv2.resize(img1, (500, 200))
其中(500,200)代表img1要改变成的shape值的长和宽

img1 = cv2.resize(img1, (0, 0), fx=1, fy=3)
前面不设具体值,用fx、fy表示与原图像x、y的倍数关系,伸缩图像大小


图像窗口滑动条的创建和使用

createTrackbar() 这个函数用于创建一个可以调整数值的滑动条,并将滑动条附加到指定的窗口上。
滑动条(Trackbar)是一种可以动态调节参数的工具,它依附于窗口而存在。
函数参数:

def createTrackbar(trackbarName, windowName, value, count, onChange)
具体含义为:

  1. trackbarname:跟踪栏名称,创建的轨迹栏的名称。
  2. Winname:窗口的名字
  3. value 该变量的值反映滑块的初始位置。
  4. count 表示滑块可以达到的最大位置的值
  5. onChange:回调函数,每次滑动都会调用回调函数。

cv2.getTrackbarPos(trackbarname, winname) → retval
参数:
第一个:滑动条名
第二个:窗口名
返回值:指定窗口上指定滑动条的当前位置

使用方法

方法一:即先定义createTrackbar() 滑动条,再调用getTrackbarPos获取createTrackbar的返回值用变量储存,进行这样的交互操作。
方法二:也可直接调用createTrackbar() 函数,直接就运行函数,进而反复调用createTrackbar()的第五个参数——自定义函数中进行操作也可。在自定义函数中调用getTrackbarPos获取createTrackbar的返回值用变量储存,再进行交互操作。
即一个不用reateTrackbar()的第五个参数,一个用。


鼠标操作

小白学pyhon(opencv鼠标操作)_mcl19909949541的博客-CSDN博客

【Python+OpenCV入门学习】六、鼠标操作_楚俊慕的博客-CSDN博客

鼠标交互操作主要通过两个函数实现:
第一个是cv2.setMouseCallback(windowName, onMouse [, param])
第二个是**setMouseCallback()**的第二个参数,称为鼠标回调函数onMouse(event, x, y, flags, param)

cv2.setMouseCallback(windowName, onMouse [, param])
第一个是你打开的窗口名字(要对应)
第二个是你定义的鼠标事件函数(任意)
鼠标回调函数:onMouse(event, x, y, flags, param)
这个参数列表不要改变它,除了param外其他都是由回调函数自动获取值。

  1. event:由回调函数根据鼠标对图像的操作自动获得,内容包含左键点击,左键弹起,右键点击…等等等非常多的操作。
  2. x,y:由回调函数自动获得,记录了鼠标当前位置的坐标,坐标以图像左上角为原点(0, 0),x方向向右为正,y方向向下为正
  3. flags:记录了一些专门的操作
  4. param:从setMouseCallback()里传递过来的参数。该参数在setMouseCallback()处是可选参数,所以可以不设置。
    param即为我们向里面传的图片参数
python"># event:
EVENT_LBUTTONDBLCLK = 7         左键双击
EVENT_LBUTTONDOWN = 1           左键点击
EVENT_LBUTTONUP = 4             左键释放
EVENT_MBUTTONDBLCLK = 9         中间释放
EVENT_MBUTTONDOWN = 3           中间点击
EVENT_MBUTTONUP = 6             中间释放
EVENT_MOUSEHWHEEL = 11          滚轮事件
EVENT_MOUSEMOVE = 0             滑动
EVENT_MOUSEWHEEL = 10           滚轮事件
EVENT_RBUTTONDBLCLK = 8         右键双击
EVENT_RBUTTONDOWN = 2           右键点击
EVENT_RBUTTONUP = 5             右键释放

# flags:
EVENT_FLAG_ALTKEY = 32          按Alt不放事件
EVENT_FLAG_CTRLKEY = 8          按Ctrl不放事件
EVENT_FLAG_LBUTTON = 1          左键拖拽
EVENT_FLAG_MBUTTON = 4          中键拖拽
EVENT_FLAG_RBUTTON = 2          右键拖拽
EVENT_FLAG_SHIFTKEY = 16        按Shift不放事件


http://www.niftyadmin.cn/n/5333748.html

相关文章

Type Script 安装 NPM 安装

使用终端命令 npm -v 这里需要使用到npm npm node.js安装包自带 去官网 Node.js — Download下载对应版本安装 1.npm config set registry https://registry.npmmirror.com 2.npm install -g typescript error: npm notice npm notice New minor version of npm availab…

网络安全(黑客)—2024秩序

1.网络安全是什么 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 2.网络安全市场 一、是市场需求量高; 二、则是发展相对…

Vue中v-for指令的详细应用与遍历数据说明

指令:v-for。作用:用于遍历数据,生成多个结构。语法:v-for"item in xxx" :key"????"。 通俗理解:想生成多个谁,就在谁身上加v-for,别忘了写key。 key的使用原则&#…

C# 使用Bitmap 将byte[] 转成.jpg/.png/gif等图片

在 C# 中,你可以使用 System.Drawing 命名空间中的 Bitmap 类来将 byte[] 转换为 .jpg 图片。以下是一个示例代码: using System; using System.Drawing; using System.IO;class Program {static void Main(){byte[] imageBytes GetImageBytes(); // 获…

C++:通过ofstream写入二进制文件内容

C++:通过ifstream读取二进制文件内容_c++ ifstream 二进制读取-CSDN博客 介绍了读取二进制文件的方法。 本文介绍一下写入二进制数据到文件的方法: 1.通过write #include <fstream> #include <string> using namespace std; int main() {int data = 0x0102030…

内网穿透的应用-使用Docker搭建一个Wiki.Js知识库系统并实现分享他人远程创作

文章目录 1. 安装Docker2. 获取Wiki.js镜像3. 本地服务器打开Wiki.js并添加知识库内容4. 实现公网访问Wiki.js5. 固定Wiki.js公网地址 不管是在企业中还是在自己的个人知识整理上&#xff0c;我们都需要通过某种方式来有条理的组织相应的知识架构&#xff0c;那么一个好的知识整…

leedcode刷题笔记day1

题目大意&#xff1a; 暴力解法 两个for循环&#xff08;也是我一看到题目想到的方法&#xff09; 枚举在数组中所有的不同的两个下标的组合逐个检查它们所对应的数的和是否等于 target 复杂度分析 时间复杂度:O(n2)&#xff0c;这里 n 为数组的长度 空间复杂度:O(1)&#x…

Elastic Stack(1):Elastic Stack简介

1 简介 ELK是一个免费开源的日志分析架构技术栈总称&#xff0c;官网https://www.elastic.co/cn。包含三大基础组件&#xff0c;分别是Elasticsearch、Logstash、Kibana。但实际上ELK不仅仅适用于日志分析&#xff0c;它还可以支持其它任何数据搜索、分析和收集的场景&#xf…