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

发布时间:2024年01月18日

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)

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获取笔记本电脑本机摄像头
文件及路径获取视频文件
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()`
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 指示是黑白画面还是彩色的画面
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’) 数据类型

  • 图像颜色通道提取

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值

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时需要填充的常数值

举例:

`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即为我们向里面传的图片参数
# 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不放事件

文章来源:https://blog.csdn.net/SavEMyselF1/article/details/135631781
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。