Python应用于图像处理出现的编程问题

本文介绍了Python在图像处理中遇到的问题,包括matplotlib中文显示设置,图像通道转换,读取、显示和保存图片的各种方法,如PIL、matplotlib和OpenCV。还详细讲解了BGR到RGB的转换,img.shape属性,以及如何利用cv2.findContours()函数查找并绘制图像轮廓。
摘要由CSDN通过智能技术生成


专业相关,将在用python处理图像问题中遇到的问题整理下来。

1.python matplotlib 中文显示参数设置

有时候无法正常显示中文的原因:
大致就是matplotlib库中没有中文字体。

解决方案
每次编写代码时进行参数设置

#coding:utf-8
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
#有中文出现的情况,需要u'内容'

2.img[:,:,::-1]的作用

转载自:img[:,:,::-1]的作用

作用就是实现RGB到BGR通道的转换 (若图片一开始就是BGR的,就是实现从BGR到RGB的转换)。

对于列表img进行img[:,:,::-1]的作用是列表数组左右翻转,例如:

  import numpy as np
     
    a = np.arange(27).reshape(3,3,3)
    print(a)
    '''
    [[[ 0  1  2]
      [ 3  4  5]
      [ 6  7  8]]
     [[ 9 10 11]
      [12 13 14]
      [15 16 17]]
     [[18 19 20]
      [21 22 23]
      [24 25 26]]]
    '''
    b = a[:,:,::-1]
    print(b)
    '''
    [[[ 2  1  0]
      [ 5  4  3]
      [ 8  7  6]]
     [[11 10  9]
      [14 13 12]
      [17 16 15]]
     [[20 19 18]
      [23 22 21]
      [26 25 24]]]
    '''

可以明确看出,[:,:,::-1]的作用就是对数组进行左右翻转。那为什么对于图像而言却能实现RGB通道转换为BGR通道呢?先看一些读取图片的方法是怎么读取吧

一般有opencv(cv2)和matplotlib(plt)的读取方式:(cv2把图片读取后是把图片读成BGR形式的,plt则是读成RGB形式)
用opencv(即cv2)读取图片,是以BGR的形式来读取的。我们用cv2的imshow()函数显示图片发现跟我们打开图片的样子一样,是因为cv2的imshow()又把BGR转回RGB再显示。但cv2确实是以BGR形式读取图片的,而plt则是以RGB形式。

3.img.shape

img.shape[:2] 取彩色图片的长、宽。 img.shape[:3] 则取彩色图片的长、宽、通道。

关于img.shape[0]、[1]、[2]

img.shape[0]:图像的垂直尺寸(高度)
img.shape[1]:图像的水平尺寸(宽度)
img.shape[2]:图像的通道数

在矩阵中,[0]就表示行数,[1]则表示列数

4.Img[:,:,2]

opencv假设图像是RGB三分量组成的图像,那么图像的

  • 第一通道是R, 第二通道是G, 第三通道是B

Img[:,:,2]代表R通道,也就是红色分量图像;
Img[:,:,1]代表G通道,也就是绿色分量图像;
Img[:,:,0]代表B通道,也就是蓝色分量图像。

5.Python中读取、显示和保存图片的方法

转载自以下链接
python读取图片

方法1:利用 PIL 中的 Image 函数

这个函数读取出来不是 array 格式,这时候需要用 np.asarray(im) 或者 np.array(im)函数将其处理成array格式。
区别:np.array() 是深拷贝,np.asarray() 是浅拷贝。浅拷贝只拷贝父对象,不会拷贝对象的内部的子对象;深拷贝会拷贝对象及其子对象。

from PIL import Image
import numpy as np


#读取
image = Image.open('fur.jpg')
#显示
image.show()
#保存
image.save('new.jpg')
#转换成array
im_array = np.array(image)
print(im_array.shape)
#array转换成image
img = Image.fromarray(np.uint8(im_array))
img.save('new1.jpg') #还可以指定图片质量img
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值