基于opencv的计算机视觉基础

基于opencv的计算机视觉基础,第1张

基于opencv的计算机视觉基础

基于这篇博客学习的基础框架搭配,以及opencv安装可以自行在其他博客查阅

1、图片读取与展示
# 图片的读取与展示
import cv2

'''
  cv2.imread-图片读取
  cv2.imread('图片名称', 读取类型)
  读取类型:如果为0-读取灰度图片;1-读取彩色图片
'''
# D:LearningDatadeepLearningtensorflow_exerciseimg_baseimage0.jpg
img = cv2.imread('./img_base/image0.jpg', 1) 



'''
  cv2.imshow-图片展示
  cv2.imshow('窗体名称', 展示内容)
'''
cv2.imshow('image', img)




'''
  stop当前程序
  只有stop了才能展示当前的图片效果
'''
cv2.waitKey(0)

效果

2、图片写入

在上一个例子中,其实代码很简单,我们所感觉到的基本上是两步:1、文件读取;2、数据解析
但其实一共分为4步:1、文件读取;2、分装格式解析;3、数据解码;4、数据加载。只是imread和imshow将他们封装好了。
我们要进行的图片写入就是把经过解析后的数据写入即可,这里我使用同一张图片进行读取解析与写入的 *** 作

'''
  图片写入
  1、文件读取;2、分装格式解析;3、数据解码;4、数据加载
  现在的分装格式一般有jpg、png
'''

import cv2

# cv2.imread已经完成1、文件读取;2、分装格式解析
img = cv2.imread('./img_base/image0.jpg', 1) 

cv2.imwrite('image1.jpg', img) # cv2.imwrite('图片名称', 图片数据),这里的图片数据是已经解析之后的数据

效果

已经多出了一张我们写入的image1.jpg

3、不同图片质量保存

主要还是针对cv2.imwrite方法,只是这个方法可以在保存的时候实现不同质量的图片保存
(1)jpeg压缩(有损压缩)

'''
  不同图片质量保存
'''
import cv2

img = cv2.imread('./img_base/image0.jpg', 1) 
'''
  cv2.imwrite('图片名称', 图片数据, [压缩方式, 压缩比])
  这里的图片数据是已经解析之后的数据
  图片质量范围是[0,100]
'''
cv2.imwrite('imageTest.jpg', img, [cv2.IMWRITE_JPEG_CHROMA_QUALITY, 0])

首先设置图片质量为0,数字越低,压缩比越高,图片质量越低
对比更改后的图片属性


可以看到图片的体积已经进行了压缩,这种压缩是以牺牲图片质量为代价的压缩(有损压缩)
(2)png压缩(无损压缩)

'''
  png不同图片质量保存
  无损压缩
  并且可以设置透明度
'''
img = cv2.imread('./img_base/image0.jpg', 1) 
'''
  cv2.imwrite('图片名称', 图片数据, [压缩方式, 压缩比])
  这里的图片数据是已经解析之后的数据
  压缩比范围是[0,9]
'''
cv2.imwrite('imageTest.png', img, [cv2.IMWRITE_PNG_COMPRESSION, 0])

4、像素 *** 作


像素点
每个方块代表一个像素点,在计算机中,每种颜色都可以用RGB三种颜色分量进行合成,每个颜色分量的范围在[0, 255]
颜色深度
对颜色深度来说,对于8bit的来说一共可以表示2^8=256种颜色
一个像素点可以有RGB三种颜色表示,转化成二进制如下所示(计算机智能储存二进制文件)

图片的宽高
图片的宽高代表图片在水平和竖直方向上分别有多少个像素点,比如1024682代表水平方向上有682个像素点,竖直方向上有1024个像素点。
图片所占内存
比如1024
682大小的图片,1024682个像素,每个像素有3个颜色分量,每个颜色分量有8位的颜色深度,那么就是102468238bit,如果转换成字节那么再除以8。
图片存储的坐标系结构
我们通过imread读取的图片数据是个矩阵结构,矩阵中的第一个值描述的x坐标,第二个值描述的y坐标,图片读取回来后是元组形式储存,元组由三个元素组成(正常情况下应该是RGB,但是opencv中读取是bgr)

'''
  像素 *** 作:像素的读取与写入
'''
import cv2

img = cv2.imread('./img_base/image0.jpg', 1) 
(b,g,r) = img[10,10]
print(b,g,r, 'b,g,r')


接下来我们对图片数据进行更改写入

'''
  像素 *** 作:像素的读取与写入
'''
import cv2

img = cv2.imread('./img_base/image0.jpg', 1) 
(b,g,r) = img[10,10] # opencv中读取是bgr
print(b,g,r, 'b,g,r')

# 从(10,100)到(110,100)进行读取
for i in range(1, 100): # 总共100个像素点
  img[10+i, 100] = (255, 0, 0) # bgr的形式,蓝色占比1,所以总体是蓝色

cv2.imshow('image', img)

cv2.waitKey(0) # 这里也可以给别的值,代表经过一定ms后,当前程序自动执行

可以看到在我们图片的左上角出现了一条蓝色的线段

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5625253.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存