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中常见函数用法总结

OpenCV 中轮廓包裹的几个函数boundingRectminAreaRectminEnclosingCircle用法

OpenCV+python 彩色图像通道拆分与组合并判断size,shape函数的用法与区别

OpenCV saturate_cast<uchar>函数用法(饱和剔除)(像素限制溢出滤除像素设限防溢出)

matlab 中 bwboundaries 函数 的用法

[opencv] cvCopy高级用法