python

这篇博客介绍了Python图像处理的基本操作,如图片转灰度和更改尺寸,探讨了PIL、skimage和OpenCV在处理图片时的不同。此外,还详细讲解了如何添加Python路径、源码安装Python、设置和使用virtualenv以及解决pip安装依赖问题。同时,文章还涉及了dict操作、list创建、删除语句的使用以及Ubuntu下PyCharm闪退的解决方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 图片转灰度或者黑白

参考

from PIL import Image
col = Image.open("cat-tied-icon.png")
gray = col.convert('L')
gray.save(‘result_grey.png’)

bw = gray.point(lambda x: 0 if x<128 else 255, '1')
bw.save("result_bw.png")

2 PIL读取图片,更改尺寸

from PIL import Image
test = Image.open('4.jpg')
gray_image = test.convert('L') # 'L'表示灰度图像,'1'表示二值图像,
new_image = test.resize((28,28))

图形模式详情

resize是PIL是自带的更改尺寸函数,但会造成图片的变形

def letterbox_image(image, size):
    '''resize image with unchanged aspect ratio using padding'''
    iw, ih = image.size
    w, h = size
    scale = min(w/iw, h/ih)
    nw = int(iw*scale)
    nh = int(ih*scale)

    image = image.resize((nw,nh), Image.BICUBIC)
    #Image.new生成新的图片,彩色图片mode='RGB',灰色图片mode='L'
    new_image = Image.new('L', size, 128)
    new_image.paste(image, ((w-nw)//2, (h-nh)//2))
    return new_image

3 读取图片,变更shape,相互转换

from PIL import Image
import numpy as np
test = Image.open('test.jpg')
atrr = np.array(test)
#atrr = atrr/255 #归一化

#变更shape有多种方式,如下
atrr_3d = np.expand_dims(atrr, axis=0)
#atrr_3d = np.reshape(atrr,(-1,28,28)) #(28,28)为原本图片尺寸
#atrr_3d = atrr[np.newaxis, ...]

np.save('test.npy',atrr_3d)

图片格式与numpy格式互转

sklearn的skimage模块读取图片后的格式为numpy,不用互转,图片通道是RGB

import skimage.draw
image_numpy = skimage.io.imread('test.jpg')
skimage.io.imsave(image_path, image_numpy)

PIL的Image读取图片与numpy互转

from PIL import image
import numpy as np
image_PIL = Image.fromarray(img_numpy.astype('uint8')).convert('RGB')
image_numpy = np.array(img_PIL)

CV2读取图片后的格式为numpy,不用互转,图片通道是GBR

import CV2
image_numpy = cv2.imread('test.jpg')
image_numpy_rgb = cv2.cvtColor(image_numpy,cv2.COLOR_BGR2RGB)
cv2.imwrite(image_path, image_numpy)

4 提取路径中的文件名

filepath = ‘a/b/c’
filename = os.path.basename(filepath)
print(filename)
head, tail = os.path.split(filepath)
print(tail)

参考

5 添加python path

Windows下,在terminal下输入

set PYTHONPATH=E:\PycharmProjects\models

Linux下,在shell下输入

export PYTHONPATH=$PYTHONPATH:/path/to/models

6 通过源码安装python3

下载python3源码wget https://www.python.org/ftp/python/3.6.7/Python-3.6.7rc2.tgz

创建目标文件夹mkdir /usr/local/python3

将源码解压到目标文件夹tar -zxvf Python-3.6.7rc2.tgz -C /usr/local/python3

进入目标文件夹cd Python-3.7.0

编译

./configure  --prefix=/usr/local/python3
make
make install

在./configure 后增加 --enable-shared,可以生成libpython3.5m.so文件
在/usr/local/python3/PythonX.X.X/bin下,运行./python3时,提示找不到libpython3.5m.so.1.0

ldd python3 # 查看运行python3需要哪些依赖,发现缺少libpython3.5m.so.1.0
find / -name 'blibpython3.5m.so.1.0' # 在根目录下查找libpython3.5m.so.1.0的路径
echo '/path/to/libpython3.5m.so.1.0' > /etc/ld.so.conf.d/python3.6.conf #
idconfig

7 virtualenv 安装

安装virtualenv pip install virtualenv

创建解释器为python的虚拟环境 virtualenv -p /path/to/python3 /path/to/virtualEnvFolder

更改/path/to/virtualEnvFolder为普通用户权限

chown admin -R virtualEnvFolder
chgrp admin -R virtualEnvFolder

进入虚拟环境Source virtualEnvFolder/bin/activate

退出 deactivate

8 不激活virtualenv环境,使用环境下的指令

/root/yanzi/scrapyENV/bin/python3 -m scrapy crawl maotai

9 pip安装

curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python get-pip.py

参考

9.1 使用pip命令安装程序提示找不到ssl(pip安装软件前必装)

openssl只包含了可执行部分,openssl-devel才包含了头文件、头文件参考、某些库文件等跟开发相关的东西。所以只安装openssl是找不到相应的头文件的

yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel

参考

通过编译python安装包安装python后,通过pip安装软件,提示缺少ssl时,说明python3在编译时没有添加ssl,重新编译./configure --with-ssl
参考

9.2 通过pip安装scrapy,提示找不到合适的twisted版本,可通过源码编译安装

wget https://twistedmatrix.com/Releases/Twisted/17.1/Twisted-17.1.0.tar.bz2
tar -jxvf Twisted-17.1.0.tar.bz2
cd Twisted-17.1.0
python setup.py install

10 在tar解压缩tar.bz2文件时,提示找不到bz2子命令,安装bzip2和bzip2-libs

yum install bzip2
yum install bizp2-libs

10.1 若提示缺少zlib,安装zlib包

yum -y install zlib*

安装zlib可能会发生64位和32位的冲突,根据系统的版本选择对应的版本

yum -y install zlib* --setopt=protected_multilib=false

参考

11 判断dict是否含有key

wine_dict = {'贵州茅台酒': 0, '茅台王子酒': 1, '茅台迎宾酒': 2, '财富酒': 3}
test = '贵州茅台酒'
if test in wine_dict.keys():
    print('ture')

12 通过循环创建list的简约形式

target_list = [wine_dict[x.strip()] if x.strip() in wine_dict.keys() else 7 for x in names]
target_list = [wine_dict[x.strip()] for x in names if x.strip() in wine_dict.keys()]

13 字典通过value找key

遍历

def get_keys(d, value):
    return [k for k,v in d.items() if v == value]

get_keys({'a':'001', 'b':'002'}, '001')

创建新字典

dicxx = {'a':'001', 'b':'002'}
new_dict = {v:k for k,v in dicxx.items()}  # {'001': 'a', '002': 'b'}
new_dict['001']

14 python中del的用法

python的del不同于C的free和C++的delete

由于python都是引用,而python有GC机制,所以,del语句作用在变量上,而不是数据对象上

if __name__=='__main__':
    a=1       # 对象 1 被 变量a引用,对象1的引用计数器为1
    b=a       # 对象1 被变量b引用,对象1的引用计数器加1
    c=a       #1对象1 被变量c引用,对象1的引用计数器加1
    del a     #删除变量a,解除a对1的引用
    del b     #删除变量b,解除b对1的引用
    print(c)  #最终变量c仍然引用1
if __name__=='__main__':
    li=[1,2,3,4,5]  #列表本身不包含数据1,2,3,4,5,而是包含变量:li[0] li[1] li[2] li[3] li[4]
    first=li[0]     #拷贝列表,也不会有数据对象的复制,而是创建新的变量引用
    del li[0]
    print(li)      #输出[2, 3, 4, 5]
    print(first)   #输出 1

参考

15 ubuntu下pycharm闪退

将默认的jdk改为jdk1.8
官方解决办法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值