OpenCV的安装和简单使用(Windows):图片的输入输出和批量裁剪

0.前言

·  做图像处理少不了OpenCV,OpenCV功能强大且轻量,可以跨平台使用,十分实用。今年9月其使用CUDA的接口也被实现了。笔者作为第一次使用OpenCV的小白,在这里记录和分享一下OpenCV在python上的简单使用。
这里分享两个实用的网站:
OpenCV各版本全模块说明文档:OpenCV Modules
OpenCV说明文档下载网址:OpenCV Download

1. OpenCV的安装

·  这个网上的教程挺多的,这里不做太多教程了(因为我的博客没有人看 )。
·  只介绍一种安装方式:在终端中激活虚拟环境后(如果没创建虚拟环境就不用这一步)直接pip install就行。在我的电脑上具体如下:

activate tensorflow_cpu
pip install opencv-python

·  然后在python命令下import cv2成功了表示安装完成。输入cv2.__version__可以查看OpenCV的版本,我这里是4.1.1

2. 简单的图像处理操作

#所有的cv2都用cv
import cv2 as cv

2.1 图像输入

img = cv.imread(filename[, flags])

·  这个函数可以将.jpg\.png等图片读入,值得注意的是,读入能否成功仅和文件的数据格式有关,和后缀名没有任何关系。其中:flags表示读取的方式,其实有很多种方式,具体可以参考官方文档:Image file reading and writing。这里只介绍三种:

取值含义
-1(默认)表示按照图片编码读入,不做任何处理,保留所有数据
0图像灰度处理后把所有像素点按照灰度值储存
1图像保留RGB三通道的值,每个像素点都保存RGB值

·  该函数返回的是一个cv::Mat的结构,说白了就是一个矩阵,使用img.shape可以查看矩阵的维度:长宽以及每个像素点的维度。

  • 这里给出一个我在学习时候的例子:
img = cv.imread("I:\\Master\\Lab\\EMCManagement\\code\\testCV\\test01\\pic\\b.jpg",1)
print(img.shape) #(1010,1380,3)
cv.imshow("", img)
cv.waitKey(0)
cv.destroyAllWindows()
  • 输出图像
    在这里插入图片描述
  • 解释
  1. 可以看到,img.shape输出了(1010,1380,3)表示该图片高度是1010个像素点,宽度是1380个像素点,每个像素点保存了3个值。
  2. cv.imshow("",img)在新窗口显示图片,waitKey(0)相当于system("pause")

2.2 图像输出和压缩

cv.imwrite(filename[, flags])
cv.resize(img,dsize[, dst[, fx[, fy[, interpolation]]]]	)

·  具体可选参数的含义在前言的文档中都有详细说明,这里不赘述了,一般而言我们都用默认值。值得注意的是在图片压缩函数cv.resize()中,dsize要传入一个元组,表示(宽,高),不要写反了。

2.3 图片批量裁剪

·  因为实验需要,我要把一张图像切蛋糕一样切均匀切成很多份。OpenCV提供了一个非常方便的方法,和python的切片一样:img_temp = img[0:50, 0:50]就表示把img图片的左上50x50像素点阵保存进img_temp里,这就实现了图片的裁剪。
·  我利用这个方法构建了一个函数,这个函数可以指定裁剪尺寸并将裁剪的图片进行存储:cutImgIntoPieces(img, outputDir, space)其中space传入一个元祖,表示裁剪在(高,宽)上的间隔。

  • 实验如下:(我把此函数封装进了cxyFunc.py中)
import cv2 as cv
import cxyFunc as cxy

img = cv.imread("I:\\Master\\Lab\\EMCManagement\\code\\testCV\\test01\\pic\\b1.jpg",0)
img = cv.resize(img,(500, 400))
outputDir = "I:\\Master\\Lab\\EMCManagement\\code\\testCV\\test01\\pic\\bePrcessed\\temp"
cxy.cutImgIntoPieces(img, outputDir,20,50)
  • 结果如下
    在这里插入图片描述
    可以看到,图片被成功的裁剪了。

  • 函数代码如下,我也顺便写了一个用来显示图片的函数,因为这个函数还蛮常用的。

import cv2 as cv

def showImg(img, *imgName):
    if(len(imgName) == 0):
        name = "untitled"
    else:
        name = imgName[0]
    cv.imshow(name, img)
    cv.waitKey(0)
    cv.destroyAllWindows()

def cutImgIntoPieces(img, outputDir, *space):
    index_x, index_y, width, height = 1,1,0,0
    img_size_height,img_size_width = img.shape[0], img.shape[1]
    if(len(space) > 1):
        space_height,space_width = space[0],space[1]
    else if(len(space) == 0):
        space_height,space_width = img.shape[0], img.shape[1]
    else:
        space_height,space_width = space[0]
    while(True):
        while(True):
            img_temp = img[height : height+space_height, width : width+space_width]
            cv.imwrite(outputDir + "\\img_%d_%d.jpg" %(index_x, index_y), img_temp)
            index_y += 1
            if weight >= (img_size_width - space_width):
                break
            else:
                width += space_width
        if height >= (img_size_height - space_height):
            break
        else:
            width = 0
            index_y = 1
            height += space_height
            index_x += 1

3. 总结

·  最近真的太忙了,没有时间写博客,也没有时间学习自己的东西,今后会不定期更新一些关于cv或者其他方面的应用。我姑且一写,有缘的话你姑且一看。最近有很多对于人生的感悟,人不过是茫茫宇宙中的一粒沙,我们现在的技术到底在宇宙中是一种怎样的存在,谷歌最近发布了关于量子计算的论文,我突然有点想去投身这种科研事业中去看一看现在人类的极限是什么。有机会我打算写一写关于量子纠缠的东西,如果量子真的能跨维度交流,那这个世界可就太神奇啦。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值