OpenCV入门

OpenCV入门

1.1读图、展示和保存新图

主要用到三个函数cv2.imread()、cv2.imshow()、cv2.imwrite().
代码示例

import cv2 as cv
image=cv.imread("D:/picture/9.jpg")
cv.namedWindow("picture",cv.WINDOW_AUTOSIZE)
print(f"width:{image.shape[1]} pixels")
print(f"height:{image.shape[0]} pixels")
print(f"height:{image.shape[2]}")
cv.imshow("picture",image)
cv.waitKey(0)
cv.imwrite("new_image.jpg",image)
cv.destroyAllWindows()

运行结果
在这里插入图片描述

上述代码,用cv.imread()读入图像,两个参数(1)简单的传入一个图像的地址参数,并返回一个代表图片的Numpy数组.(2)读取图片返回的形式,有三种选择:cv2.IMRE AD_COLOR、cv2.IMREAD_GRAYSCALE和cv2.IMREAD_UNCHANGED,其中IMREAD_UNCHANGED表示不变,比如有alpha通道,它会读取。alpha通道的作用是按比例将前景像素和背景像素进行混合,来衡量图像的透明度。也可以使用数字来表达读图模式,比如1,0或-1分别表示COLOR、GRAYSCALE和UNCHANGED
OpenCV采用的格式为HWC,即高度宽度通道数,通道数顺序为BGR,与Python的Pillow库(RGB)不同。
imshow()函数有两个参数(1)第一个参数为窗口名字的字符串,(2)第二个参数为OpenCV读入图片返回的Numpy对象。waitKey(0)表示停止图片显示,执行后续语句,数字0表示按键后0毫秒执行。
imwrite()函数表示保存为新的图片,参数为保存地址和图像对象。

1.2像素点及局部图像

局部图像

import cv2 as cv
image=cv.imread("D:/picture/9.jpg")
x=image.shape[0]
y=image.shape[1]
hh=image[0:330,0:330]
cv.namedWindow("picture",cv.WINDOW_AUTOSIZE)
cv.imshow("picture",image)
cv.imshow("hh",hh)
print("x=",x)
print("y=",y)
cv.waitKey(0)
cv.destroyAllWindows()

结果
在这里插入图片描述

修改后图像

import cv2 as cv
image=cv.imread("D:/picture/9.jpg")
x=image.shape[0]
y=image.shape[1]
hh=image[0:330,0:330]
image[0:33,0:30]=(255,0,255)
cv.namedWindow("picture",cv.WINDOW_AUTOSIZE)
cv.imshow("picture",image)
cv.imshow("hh",hh)
print("x=",x)
print("y=",y)
cv.waitKey(0)
cv.destroyAllWindows()

结果
在这里插入图片描述

2.3基本线条操作

import cv2 as cv
import numpy as np
pit=np.zeros((700,600,3),dtype='uint8')
for _ in range(0,25):
    radius=np.random.randint(5,200)
    color=np.random.randint(0,256,size=(3,)).tolist()
    pt=np.random.randint(30,200,size=(2,))
    cv.circle(pit,tuple(pt),radius,color,-1)
cv.imshow('canvas',pit)
cv.waitKey(0)

pit=np.zeros((700,600,3),dtype='uint8')

调用zeros()方法,生成700*300的全零数组(3个700行600列的全零矩阵),dtype定义数据类型为uint8,(默认numpy.float64),

for _ in range(0,25):

调用range()函数,函数原型:range(start, end, scan):起始,终止,步长。从0到24.

 radius=np.random.randint(5,200)

函数原型numpy.random.randint(low, high=None, size=None, dtype='l')size表示返回数的类型(默认为none,表示返回单数值)。

 color=np.random.randint(0,256,size=(3,)).tolist()

返回3个随机数,randint—产生[low,high)中的随机整数

 cv.circle(pit,tuple(pt),radius,color,-1)

函数原型:circle(img, center, radius, color, thickness=None, lineType=None, shift=None)详解:链接:https://blog.csdn.net/kun1280437633/article/details/84540849
结果:在这里插入图片描述

1.4平移

import cv2 as cv
import numpy as np
image=cv.imread('D:/picture/5.jpg')
M=np.float32([[1,1,25],[0,1,50]])
shift_pit=cv.warpAffine(image,M,(image.shape[1],image.shape[0]))
cv.imshow('gg',shift_pit)
cv.imshow('first',image)
cv.waitKey(0)
cv.destroyAllWindows()

M=np.float32([[1,1,25],[0,1,50]])

M中的参数[1,1,25]表示向[1,1]方向移动25个像素。[0,1,50]同理,表示向下移动50像素。

shift_pit=cv.warpAffine(image,M,(image.shape[1],image.shape[0]))

image要平移的图像,M平移矩阵。image[],高度和宽度。根据平移矩阵进行仿射变换。

结果

在这里插入图片描述

1.5旋转

代码

import cv2 as cv
import numpy as np
image=cv.imread('D:/picture/5.jpg')
(h,w,_)=image.shape[:3]
center=(w/3,h/2)
M=cv.getRotationMatrix2D(center,180,2.0)
Rotated_image=cv.warpAffine(image,M,(h,w))
cv.imshow('Rotated_image',Rotated_image)
cv.imshow('first',image)
cv.waitKey(0)
cv.destroyAllWindows()

(h,w,_)=image.shape[:3]

调用shape函数返回3个元素

center=(w/3,h/2)

定义旋转中心点(像素点)

M=cv.getRotationMatrix2D(center,180,2.0)

创建旋转矩阵M,cv.getRotationMatrix2D有三个参数:第一个为旋转时固定的点;第二个为旋转角度;第三个为图片缩放尺度。

Rotated_image=cv.warpAffine(image,M,(h,w))

根据旋转矩阵进行仿射变换

结果

在这里插入图片描述

1.6缩放

缩放使用cv2.resize()函数。

代码

import cv2 as cv
import numpy as np
image=cv.imread('D:/picture/5.jpg')
new_w,new_h=1000,200
resized_image=cv.resize(image,(new_w,new_h),interpolation=cv.INTER_AREA)
cv.imshow('resized_image',resized_image)
cv.imshow('first',image)
cv.waitKey(0)
cv.destroyAllWindows()

resized_image=cv.resize(image,(new_w,new_h),interpolation=cv.INTER_AREA)

cv.resize()函数可使用三个参数,第一个图像对象,第二个参数为缩放尺寸,第三个参数为插值选项,(关于插值选项:https://blog.csdn.net/guyuealian/article/details/85097633)使用cv.INTER_AREA插值方式,将原图image缩放为1000px*200px的新图。
简要说明一下,缩小就是删除其中某些像素,直接达到需要缩小的目标尺寸,所以存在信息丢失的现象,放大就是在图像中添加一些像素,使图像变大到目标尺寸。插值就是寻找最优删除或添加像素的放法。
对于OpenCV而言,官方建议缩小使用cv.INTER_AREA,放大使用cv.INTER_LINEAR。cv.INTER_CUBIC相对较慢。cv.resize会默认使用cv.INTER_LINEAR插值公式.

1.7翻转

翻转分为水平翻转和垂直翻转,API为cv.flip(),第二个参数1表示水平翻转,0表示垂直翻转,-1表示水平加垂直翻转。

代码

import cv2 as cv
import numpy as np
image=cv.imread('D:/picture/5.jpg')
second_image=cv.flip(image,0)
thrid_image=cv.flip(image,1)
four_image=cv.flip(image,-1)
cv.imshow('first_image',image)
cv.imshow('second_image',second_image)
cv.imshow('thrid_image',thrid_image)
cv.imshow('four_image',four_image)
cv.imshow('first',image)
cv.waitKey(0)
cv.destroyAllWindows()

结果
在这里插入图片描述

1.8裁剪

代码

import cv2 as cv
import numpy as np
image=cv.imread('D:/picture/2.jpg')
print(image.shape)
cropped_image=image[0:1000,0:1000]
cv.imshow('cropped_image',cropped_image)
cv.waitKey(0)
cv.destroyAllWindows()
cropped_image=image[0:1000,0:1000]

裁剪坐标为[x1:x2, y1:y2],即左上角为坐标原点。

结果

在这里插入图片描述

1.9 为位操作

代码

import numpy as np
import cv2 as cv
rectangle=np.zeros((300,300),dtype='uint8')
cv.rectangle(rectangle,(30,30),(60,60),255,-1)
cv.imshow("Rectangle",rectangle)
circle=np.zeros((300,300),dtype='uint8')
cv.circle(circle,(45,45),19,255,-1)
cv.imshow('circle',circle)
bitwisedAnd=cv.bitwise_and(rectangle,circle)
cv.imshow("And",bitwisedAnd)
bitwisedOr=cv.bitwise_or(rectangle,circle)
cv.imshow("bitwise0r",bitwisedOr)
bitwiseXor=cv.bitwise_xor(rectangle,circle)
cv.imshow("bitwiseXor",bitwiseXor)
bitwiseNot=cv.bitwise_not(rectangle,circle)
cv.imshow('bitwiseNot',bitwiseNot)
cv.waitKey(0)
cv.destroyAllWindows()

cv.rectangle(rectangle,(30,30),(60,60),255,-1)

定义矩形,(30,30)为起始点,(60,60)为矩形对角线上的点,255为线条颜色(255,0,0),-1为填充效果,为正数时数值越大线条越粗。

cv.bitwise_xor,cv.bitwise_and,cv.bitwise_or,cv.bitwise_not

对两张图片分别做了交集(And),并集(Or),异或(Xor),对园做了一次非(Not)操作。
OpenCV 按位bitwise运算、掩膜mask运算详解 表格+图解 Python代码实例详解 基础实用款

结果

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值