码迷,mamicode.com
首页 > 其他好文 > 详细

opencv对图片的一些操作

时间:2020-03-09 22:32:05      阅读:58      评论:0      收藏:0      [点我收藏+]

标签:yield   pyplot   opencv   import   des   invisible   因此   功能   lang   

工作环境Linux Ubuntu 16.04, Python 3.6, OpenCV 4.0。因为OpenCV的数据结构是基于numpy的,所以也要对numpy有大概的了解。

首先导入必要的库:

import cv2
import numpy as np
from matplotlib import pyplot as plt

由于Ubuntu下cv2的imshow展示图片功能会有bug,因此使用matplotlib来展示图片。

一,图片读写:

Basic

图片读入:

image = cv2.imread(‘test.jpg‘, -1)

没什么好说的,第一个参数文件路径,第二个参数是通道数,-1代表原图与原图保持一致,0代表转换为灰度图,1代表使用BGR通道读入。

需要注意的就是读入的图片是以np.ndarray类型存储的,且彩色图像的通道为BGR与常见的RGB不同。

图片展示:

cv2.imshow(‘image‘, image)
cv2.WaitKey(0)
cv2.destroyAllWindows()

imshow第一个参数是窗口名,string类。第二个是np.ndarray的数组。注意在下面要使用WaitKey,不然展示窗口就会闪一下,程序就继续运行了,参数代表停多长时间,0的话是除非干扰不然一直展示。

在Ubuntu下cv2的imshow会出bug, 使程序崩溃,因此使用pyplot展示图片,但需要注意pyplot的彩色图片是RGB的格式,所以展示图像时需要先转换通道。

对于灰度图像:

plt.imshow(image, cmap=‘gray‘)
plt.show()

对于彩色图像:

image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
plt.imshow(image)
plt.show()

图片写出:

cv2.imwrite(‘image.jpg‘, image)

这边需要注意的是第一个参数文件名要加格式,比如.jpg .png 之类的。

More

多的话只对文件读入加一些。

读取某个文件夹下所有jpg或其他图片可以使用glob,但无法读取子文件夹下的。

import glob
PATH = ‘‘
for file in glob.glob(PATH + ‘*.jpg‘):
    img = cv2.imread(file, -1)

也可以把jpg改为png等等。

那么如何读取一个文件夹内包括其子文件夹下的所有图片呢?这个时候要用os和fnmatch了。

import os
import fnmatch


def find_files(directory, pattern):
    """
    Method to find target files in one directory, including subdirectory
    :param directory: path
    :param pattern: filter pattern
    :return: target file path
    """
    for root, dirs, files in os.walk(directory):
        for basename in files:
            if fnmatch.fnmatch(basename, pattern):
                filename = os.path.join(root, basename)
                yield filename

for filename in find_files(‘Home/Leon‘, ‘*.jpg‘):
    img = cv2.imread(filename, -1)

这个看一下应该就知道怎么回事了把?find_files引用了一个网上的代码我忘了哪个了,,,

然后对读入的图片色彩空间转换,常用cvtColor

img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

第二个参数很多种,常用的色彩空间也就是把BGR转成RGB或者Gray,偶尔会用HSV,因为HSV不会有很多颜色的参数,对于图片的纹理啊这些特征的提取和处理很有用。HSV三个通道分别是:色调(H),饱和度(S),明度(V)。具体释义可以看维基百科的

实话讲对HSV我理解的不多,反正就是H跟颜色有关,是一种对于RGB的非线性变换,饱和度的话就是我们有时候会说有些颜色好艳啊之类的,我会用来提取纹理,V明度我一直就认为是类似灰度值了。印象中有专门的矩阵来乘可以完成两个色彩空间的变换。

转OpenCV 常用总结(Python) 知乎 https://zhuanlan.zhihu.com/p/61315333

opencv对图片的一些操作

标签:yield   pyplot   opencv   import   des   invisible   因此   功能   lang   

原文地址:https://www.cnblogs.com/liurenyu/p/12451992.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!