opencv的img.flat的函数用法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了opencv的img.flat的函数用法相关的知识,希望对你有一定的参考价值。
Mat类:是用于保存图像以及其他矩阵数据的数据结构。
图像载入函数imread():
Mat imread(const string& filename, int flags=1);
filename表示图像载入的路径;
flags为载入标识。
flags=0 将图像转换为灰度再返回;
flags=1 将图像转换成彩色再返回;
flags=2 若载入图像的深度是16位或者32位,就返回对应的图像深度,否则,将图像转换为8位图像再返回。
flags=2|4 载入最真实无损的源图像
若flags不在枚举类型当中,flags>0 返回一个三通道的彩色图像;flags=0 返回灰度图像;flags<0 返回包含Alpha通道的加载图像。
图像显示函数imshow():
void imshow(const string& winname, InputArray mat);
winname填写要显示的窗口标识名称;
mat填需要显示的图像。
输出图像到文件imwrite():
bool imwrite(const string& filename, InputArray img, const vector& params=vector());
第一个参数filename表示要写入的文件名
第二个参数img表示Mat类型的图像数据
通道分离split()函数;
void split(const Mat& src, Mat* mvbegin);
void split(InputArray m, OutputArrayofArray mv);
第一个参数表示需要进行分离的多通道数组;
第二个参数表示函数 输出数组或输出的vector容器。
通道合并merge()函数:
void merge(const Mat* mv, size_t count, OutputArray dst)
void merge(InputArrayOfArray mv, OutputArray dst);
第一个参数mv表示需要被合并的输入矩阵或vector容器的阵列,mv参数中所有矩阵必须拥有一样的尺寸;
第二个参数count表示当mv为空白的C数组时,代表输入矩阵的个数,通常可以省略不写;
第三个参数dst表示输出矩阵,和mv拥有一样的尺寸和深度
Python与OpenCV图像简单操作
文章目录
OpenCV安装
1.读取图片
2.保存图片
3.截取部分图像
4.图片翻转
5.缩放图片
6.转换为灰度图像
7.在一个窗口中显示两张图片
8.绘图功能
OpenCV安装
打开命令行输入 pip install opencv-python(前提是有python环境)
1.读取图片
使用 cv2.imread() 函数,给出了几种读取图片路径的写法
import cv2#导入opencv包
#python中不需要声明变量
img1 = cv2.imread("D:/test/1.jpg")#绝对路径,推荐
img2 = cv2.imread("D:\\test\\2.jpg")#通常是两个斜线,单右斜线会被当成转义符
img3 = cv2.imread("3.jpeg")#相对路径,将图片放在py文件对应目录下
cv2.imshow("test1", img1)
cv2.imshow("test2", img2)
cv2.imshow("test3", img3)
cv2.waitKey(0)#没有这一句图片会一闪而过
##waitkey(delay=0),等待用户输入按键,返回该按键的值
2.保存图片
使用 cv2.write() 函数保存图片
import cv2# 导入OpenCV包
img=cv2.imread("D:/test/3.png",cv2.IMREAD_COLOR)
cv2.imshow("test",img)#OpenCV可以实现不同格式图片转换,支持jpg、bmp、png等图片格式相互无损转换
cv2.imwrite("D:/test/3.1.png",img)#将改变后的图像保存
cv2.imwrite("D:/test/3.2.bmp",img)
cv2.waitKey(0)
3.截取部分图像
import cv2
img = cv2.imread("D:\\test\\2.jpg")
frame = img[200:400,200:400] #截取部分图像,200-400行,200-400列
cv2.imshow("test",frame)#显示截取后的图像
cv2.waitKey(0)
4.图片翻转
使用cv2.flip(img,flipcode)来进行图片翻转
flipcode控制图片翻转方向
import cv2
img=cv2.imread("D:/test/5.jpg",cv2.IMREAD_COLOR)
flipCode1=1#大于0左右翻转
flipCode2=0#等于0上下翻转
flipCode3=-1#小于0先上下翻转再左右翻转
img1 = cv2.flip(img, flipCode1)#filpCode控制图片翻转方向
img2 = cv2.flip(img, flipCode2)
img3 = cv2.flip(img, flipCode3)
cv2.imshow("test",img)
cv2.imshow("test1",img1)
cv2.imshow("test2",img2)
cv2.imshow("test3",img3)
cv2.waitKey(0)
5.缩放图片
cv2.resize(img,dsize,fx,fy),dsize和fx,fy都可以设置图片大小,不能同时为0
import cv2# 导入OpenCV包
img = cv2.imread("D:/test/2.jpg",cv2.IMREAD_COLOR)
img1 = cv2.resize(img, (700, 700))#设置输出图片的尺寸
img2 = cv2.resize(img, None, fx=0.7, fy=0.7)#None的位置本来是输出图片的尺寸,这里设置了缩放因子
#fx-水平轴上的比例因子,fy-垂直轴上的比例因子
cv2.imshow("test", img)
cv2.imshow("test1", img1)
cv2.imshow("test2", img2)
cv2.imwrite("D:/test/resize.jpg", img1)# 保存图像
cv2.waitKey(0)
6.转换为灰度图像
cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
cv2.COLOR_RGB2GRAY表示把RGB图像转为灰度图像,2前是转换前,2后是转换后
import cv2#导入opencv包
#python中不需要声明变量
img = cv2.imread("D:/test/1.jpg")#cv2.imread读进来的图片格式是BGR(W,H,C),而不是RGB
cv2.imshow("BGR", img)
#将图像转换为RGB格式
img1 = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)#因为opencv读取图片是按BGR读的,所以转换为RGB反而不像原图
cv2.imshow("RGB",img1)
#将图像转换为灰度图像
img2 = cv2.cvtColor(img1, cv2.COLOR_RGB2GRAY)
cv2.imshow("GRAY",img2)
cv2.waitKey(0)
7.在一个窗口中显示两张图片
import cv2
import numpy as np
img = cv2.imread("D:/test/resize.jpg")
img2 = cv2.imread("D:/test/resize.jpg")
#imgs = np.hstack([img,img2])#在水平方向上平铺
imgs = np.vstack([img,img2])#在竖直方向上堆叠
cv2.imshow("mutil_pic", imgs)
cv2.waitKey(0)
8.绘图功能
import cv2
import numpy as np
img = 255*np.ones((350,512,3),np.uint8)#unit8:0~255
#ones()为创建一个元素均为一的矩阵
font = cv2.FONT_HERSHEY_DUPLEX
#font = cv2.FONT_HERSHEY_COMPLEX# 设置字体
#文本 # 图片对象、文本、 位置、 字体、字体大小、颜色、 字体粗细
cv2.putText(img, "happy day", (50,300), font, 0.8, (25, 25, 25), 2,)#颜色可以自己调整,范围为0-255
#线 #起点 终点 颜色 粗细
cv2.line(img, (50,310), (185,310), (0, 0,0),4)
#矩形 #左上顶点 右下顶点
cv2.rectangle(img, (80,8), (200,100), (0, 255,0),2)
#圆形 #圆心 半径 颜色 控制是否填充 -1表示填充
cv2.circle(img,(60,60),30,(0,0,213),1)
#椭圆 #中心点 长轴 短轴 偏转角度,起始角度,终止角度
cv2.ellipse(img,(100,300),(100,50),180,0,360,(20,213,79),1)
cv2.imshow("Draw", img)
cv2.waitKey(0)
1.np.vstack([img1,img2]) 当img1和img2图片矩阵维度相同时才能堆叠
2.除了imread,imwrite 函数没有返回值以外,flip,resize,cvtColor,vstack,hstack都有返回一个图片回来。 参考技术A import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
img = cv.imread('wiki.jpg',0)
hist,bins = np.histogram(img.flatten(),256,[0,256])
cdf = hist.cumsum()
cdf_normalized = cdf * float(hist.max()) / cdf.max()
plt.plot(cdf_normalized, color = 'b')
plt.hist(img.flatten(),256,[0,256], color = 'r')
plt.xlim([0,256])
plt.legend(('cdf','histogram'), loc = 'upper left')
plt.show()
你可以看到直方图位于较亮的区域。我们需要全频谱。为此,我们需要一个转换函数,将亮区域的输入像素映射到整个区域的输出像素。这就是直方图均衡化的作用。
现在我们找到最小的直方图值(不包括0),并应用wiki页面中给出的直方图均衡化方程。但我在这里用过,来自Numpy的掩码数组概念数组。对于掩码数组,所有操作都在非掩码元素上执行。您可以从Numpy文档中了解更多关于掩码数组的信息。
cdf_m = np.ma.masked_equal(cdf,0)
cdf_m = (cdf_m - cdf_m.min())*255/(cdf_m.max()-cdf_m.min())
cdf = np.ma.filled(cdf_m,0).astype('uint8')
现在我们有了查找表,该表为我们提供了有关每个输入像素值的输出像素值是什么的信息。因此,我们仅应用变换。
img2 = cdf[img]
现在,我们像以前一样计算其直方图和cdf(您这样做),结果如下所示:
另一个重要的特征是,即使图像是一个较暗的图像(而不是我们使用的一个较亮的图像),经过均衡后,我们将得到几乎相同的图像。因此,这是作为一个“参考工具”,使所有的图像具有相同的照明条件。这在很多情况下都很有用。例如,在人脸识别中,在对人脸数据进行训练之前,对人脸图像进行直方图均衡化处理,使其具有相同的光照条件。 参考技术B 是用于保存图像以及其他矩阵数据的数据结构。
图像载入函数imread():
Mat imread(const string& filename, int flags=1);
filename表示图像载入的路径;
flags为载入标识。
flags=0 将图像转换为灰度再返回;
flags=1 将图像转换成彩色再返回;
flags=2 若载入图像的深度是16位或者32位,就返回对应的图像深度,否则,将图像转换为8位图像再返回。
flags=2|4 载入最真实无损的源图像
若flags不在枚举类型当中,flags>0 返回一个三通道的彩色图像;flags=0 返回灰度图像;flags<0 返回包含Alpha通道的加载图像。
图像显示函数imshow():
void imshow(const string& winname, InputArray mat);
winname填写要显示的窗口标识名称;
mat填需要显示的图像。
OpenCV+python 彩色图像通道拆分与组合并判断size,shape函数的用法与区别
1、关于python中size与shape的用法,我一直是一头雾水,今天总结下,size既可以用作属性亦可以当做函数来使用,如a.size,np.szie(a),它是用来判断数组中所有元素的个数
,而shap与size类似,既可以用作属性亦可以当做函数来使用,如b.shape,np.shape(b),他是用来判断数组的维度
2、关于图像的加载与显示,plt.imshow与cv2.imshow显示的时候会有色差的问题,因为OpenCV显示的BGR,而plt.imshow显示的是RGB
3、通道的分离与融合分别是OpenCV中的split与merge函数
4、通过scipy.misc方法将图片转换成数组格式
1 #!/usr/bin/env python 3.6 2 #_*_coding:utf-8 _*_ 3 #@Time :2019/12/25 21:42 4 #@Author :控制工程小小白 5 #@FileName: RGB_split_merge.py 6 7 #@Software: PyCharm 8 from PIL import Image 9 import cv2 10 from scipy import misc 11 from matplotlib import pyplot as plt 12 import numpy as np 13 image_PIL=Image.open("our happy time.jpg")#打开图片 14 """判断图像类型并使用size,shape 用法""" 15 """---------------------------------------------------------------------""" 16 print(type(image_PIL))#此时的image不是数组格式,而是图片格式 17 image_numpy=misc.imread("our happy time.jpg")#通过scipy.misc方法将图片转换成数组格式 18 print(image_numpy) 19 print(type(image_numpy))#此时的输出是数组格式 20 print(np.size(image_numpy))#size既可以用作对象的属性a.size,也可以用作方法np.size(a),输出数组的元素的所有个数 21 print(image_numpy.size) 22 print(np.shape(image_numpy))#与size一样,既可以用作对象的属性a.shape,也可以用作方法np.shape(a),输出数组的维度 23 print(image_numpy.shape) 24 """---------------------------------------------------------------------------------------""" 25 """对于采用Image方法类读取并且显示图片时,下面4行一般配套使用""" 26 plt.figure(\'jiaqi\')#打开显示的窗口并给显示的窗口命名 27 plt.imshow(image_PIL)#imshow方法显示要显示的图片,如果没有plt.show()的配套使用,将不会显示图橡 28 plt.axis(\'on\')#显示坐标轴 29 plt.show()#与plt.imshow配套使用 30 """---------------------------------------------------------------------------""" 31 """opencv 加载与显示与保存图像""" 32 image_opencv=cv2.imread("our happy time.jpg")#是用OpenCV方法打开图像 33 cv2.namedWindow(\'our happy time.jpg\',cv2.WINDOW_NORMAL)#创建一个显示窗口并命名 34 cv2.imshow(\'our happy time.jpg\',image_opencv)#在这里需要注意OpenCV显示的图像与matplotlib显示的图像会有色差问题 35 #因为plt.show()接口是RGB,而OpenCV是BGR 36 plt.imshow(image_opencv)#注意这个是用OpenCV读取图像,但是是用matplotlib显示图像,个人觉得这个比cv2.imshow()显示效果要好 37 plt.show() 38 cv2.namedWindow(\'OpenCV_image\',cv2.WINDOW_NORMAL)#创建一个显示窗口并命名 39 cv2.imshow(\'OpenCV_image\',image_opencv) 40 cv2.waitKey(0) 41 k=cv2.waitKey(0)#等待键入指令 42 if k==27:#wait for ESC key to exit 43 cv2.destroyAllWindows()#销毁窗口 44 elif k==ord(\'s\'):#键入s就保存窗口 45 cv2.imwrite(\'our happy time.jpg\',image_opencv) 46 cv2.destroyAllWindows() 47 """探索OpenCV与plt.show()显示图像的区别""" 48 b,g,r=cv2.split(image_opencv)#将图像的三个通道分开,分别是B,G,R 49 image_merge=cv2.merge([r,g,b])#将三个通道按照R,G,B顺序进行融合 50 plt.figure(\'image\') 51 plt.subplot(231);plt.imshow(image_opencv)#显示使用OpenCV打开的图像BGR 52 plt.subplot(232);plt.imshow(image_PIL)#显示使用PIL打开的图像 53 plt.subplot(233);plt.imshow(b)#分别显示三个通道的图像 54 plt.subplot(234);plt.imshow(g) 55 plt.subplot(235);plt.imshow(r) 56 plt.subplot(236);plt.imshow(image_merge)#显示融合之后的RGB图像 57 plt.show()
输出结果:
<class \'PIL.PngImagePlugin.PngImageFile\'>
[[[226 137 125]
[226 137 125]
[223 137 133]
...
[230 148 122]
[221 130 110]
[200 99 90]]
[[226 137 125]
[226 137 125]
[223 137 133]
...
[230 148 122]
[221 130 110]
[200 99 90]]
[[226 137 125]
[226 137 125]
[223 137 133]
...
[230 148 122]
[221 130 110]
[200 99 90]]
...
[[ 84 18 60]
[ 84 18 60]
[ 92 27 58]
...
[173 73 84]
[172 68 76]
[177 62 79]]
[[ 82 22 57]
[ 82 22 57]
[ 96 32 62]
...
[179 70 79]
[181 71 81]
[185 74 81]]
[[ 82 22 57]
[ 82 22 57]
[ 96 32 62]
...
[179 70 79]
[181 71 81]
[185 74 81]]]
<class \'numpy.ndarray\'>
786432
786432
(512, 512, 3)
(512, 512, 3)
以上是关于opencv的img.flat的函数用法的主要内容,如果未能解决你的问题,请参考以下文章
OpenCV 中轮廓包裹的几个函数boundingRectminAreaRectminEnclosingCircle用法
OpenCV+python 彩色图像通道拆分与组合并判断size,shape函数的用法与区别