如何使用Python+opencv进行图像处理

电子说

1.3w人已加入

描述

图像是 Web 应用中除文字外最普遍的媒体格式。流行的 Web 静态图片有 JPEG、PNG、ICO、BMP 等。动态图片主要是 GIF 格式。

为了节省图片传输流量,大型互联网公司还会定制特殊格式的图片,WEBP 格式就是一个代表。

Python 除了数据分析,做图片处理也是非常好用的。

用 Python 做图片处理,最著名的库就是 PIL(Python Imaging Library)了,支持最新的 Python3,而且有许多新的特性,Pillow 也成为了 Python 图片处理必不可少的工具之一了。

不过我们今天要使用的作图库是OpenCV Python ,下一期我们再来研究PIL

这篇文章主要介绍了Python+OpenCV实现图像二值化,帮助大家更好的利用python处理图片,感兴趣的朋友可以了解下。

图片处理库准备

OpenCV Python 来处理图片,安装过程如下:

OpenCV

图片加载

我们先来打开一张图片测试,如下可以成功加载图片表示已经

成功安装OpenCV-Python

OpenCV

图片缩放

在保持图片细节不变的前提下,把图片放大或者缩小。

其中img 是图片对象,img.shape 表示图片的形状大小,分别是高、宽、通道数。

# 获取图片尺寸
img = cv2.imread("./pic1.jpg")
h, w, ch = img.shape
print(h, w, ch)
  
'''
1240 960 3
'''

我们的思路如下:

程序读入图片文件,用 cv2.resize 方法,把图片等比例缩放为一半的大小。

# 获取图片尺寸
img = cv2.imread("./pic1.jpg")
h, w, ch = img.shape
print('原图尺寸:', h, w, ch)

new_h = int(h / 2)
new_w = int(w / 2)
res = cv2.resize(img, (new_w, new_h), interpolation=cv2.INTER_LINEAR)
cv2.imwrite('./half_pic1.jpg', res)

# 获取图片尺寸
img = cv2.imread("./half_pic1.jpg")
h, w, ch = img.shape
print('缩半原图尺寸:', h, w, ch)
    
'''
原图尺寸:1240 960 3
缩半原图尺寸:620 480 3
'''

实际效果如下:

OpenCV

图片裁剪

把图片的局部形状截取出来,这里我们截取小姐姐图像,按照自己需求去掉前后左右多余边框。

img = cv2.imread("./pic1.jpg")
h, w, ch = img.shape
print(h, w, ch)
# (x0,y0) (x1,y1) 矩阵
x0, y0 = 200, 80
x1, y1 = 880, 960
# img 是一个按行扫描的矩阵
res = img[y0:y1, x0:x1]
print('截取后 H,W=', res.shape[:2])
cv2.imwrite('./pic.jpg', res)

'''
1240 960 3
截取后 H,W= (880, 680)
'''

实际效果如下:

OpenCV

图像组合

把两个或者多个图像进行堆叠、拼接。

准备一个原图 pic1.jpg,再准备一个水印图 img.png,目标是把水印贴在人像图的最右下方。

# 读取原始图片
    image = cv2.imread('./pic1.jpg')
    (h, w) = image.shape[:2]
    print("SOURCE", image.shape)

    # 读取水印
    imgsy = cv2.imread('./img.png')
    (h_sy, w_sy) = imgsy.shape[:2]
    print("SHUIYIN", imgsy.shape)

    # 定义原图片选区
    roi = image[h - h_sy:h, w - w_sy:w]

    # 原图片选区和水印区融合,让水印透明
    for y in range(h_sy):
        for x in range(w_sy):

            p = imgsy[y, x]
            if (p[0], p[1], p[2]) == (0, 0, 0):
                imgsy[y, x] = roi[y, x]

    cv2.imwrite('./shuiyin+roi.png', imgsy)

    # 选区范围设定为融合后的水印
    image[h - h_sy: h, w - w_sy: w] = imgsy

    cv2.imwrite('./pic_sy.jpg', image)
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分