基于这篇博客学习的基础框架搭配,以及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)
效果
在上一个例子中,其实代码很简单,我们所感觉到的基本上是两步: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
主要还是针对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个像素点。
图片所占内存
比如1024682大小的图片,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后,当前程序自动执行
可以看到在我们图片的左上角出现了一条蓝色的线段
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)