python图像处理

这篇博客介绍了Python图像处理的多个方面,包括查看基本参数、灰度图转换、图像格式转换、局部处理、旋转粘贴、图像轮廓和直方图分析、高斯模糊、Sobel算子应用、形态学图像分割、交互式标注、负片效果及图片添加文字。特别提到素描效果的实现,通过灰度值对比和阈值设定来突出边缘,展示了不同阈值的效果。

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

首先安装PIL:Python Image Lib

 

注意!PIL的分支:pillow

安装时应输入:pip install pillow

一、 查看基本参数&灰度图

from PIL import Image
import os
import matplotlib.pyplot as plt

im=Image.open('要查看的图片').convert("L") #conert后面的参数如果是L即灰度图,RGB即正常
print(im.format,im.size,im.mode)

#显示图片
plt.imshow(im)
plt.title("Image Practice")
plt.axis('off')
plt.show()

二、图像格式转换

from PIL import Image
import os
  
filelist=os.listdir(os.getcwd())  #查找当前目录下的所有文件

for infile in filelist:
    filename=str(infile) #提取文件名称
    isimg=filename.find('.jpg')  #查找文件名称中“.jpg”这个字符串所在的位置
    #print(isimg)
    if isimg>=0:  #即格式为jpg的文件
        outfile=infile[0:isimg]+".png"  #新的png文件的名称就是原名称.png
        if infile!=outfile:
            try:
                Image.open(infile).save(outfile) #另存一个新文件
            except IOError:
                print("Cannot convert",infile)

#try except的好处在于避免前面报错影响后面程序的运行

文件夹里会多出很多文件-_-|| 

三、取图像局部+旋转+粘贴

#打开图像并进行预处理
pil=Image.open("bear.jpg")
print(pil.format,pil.size,pil.mode)
pil=pil.convert("L")

box=(0,0,800,500) #这个框左上角的位置是(0,0),框长800像素宽500像素
region=pil.crop(box) #裁切操作
region=region.transpose(Image.ROTATE_180) #旋转180度操作
pil.paste(region,box) #再粘贴上去
plt.imshow(pil)
plt.title("bear")
plt.axis('off')
plt.show()

 四、图像轮廓和直方图

from PIL import Image
from pylab import *

#读取图像到数组
im=array(Image.open('图片名称').convert('L'))
#新建一个可视区
figure()
gray()
contour(im,origin='image')
axis('equal')
axis('off')
figure()
hist(im.flatten(),128)
show()

参数为128和参数为32的对比

 五、高斯模糊

from PIL import Image
from numpy import *
from scipy.ndimage import filters
import matplotlib.pyplot as plt


im=array(Image.open('图片名称').convert('L'))
im2=filters.gaussian_filter(im,5)

plt.figure()
plt.imshow(im)
plt.show()

 参数为5与25的对比

 六、sobel算子

from PIL import Image
from numpy import *
from scipy.ndimage import filters
import matplotlib.pyplot as plt

im=array(Image.open('bear.jpg').convert('L'))

#imx和imy是输出
imx=zeros(im.shape)
filters.sobel(im,1,imx) 

imy=zeros(im.shape)
filters.sobel(im,0,imy)

magnitude=sqrt(imx**2+imy**2)
plt.figure()
plt.imshow(imx)
plt.show()

 

七、形态学:图像分割

from PIL import Image
from numpy import *
from scipy.ndimage import measurements
import matplotlib.pyplot as plt
import os

im=array(Image.open('101.jpg'))
plt.figure()
plt.imshow(im)
im=array(Image.open('101.jpg').convert('L'))
plt.figure()
plt.imshow(im)
im=1*(im<128)
labels,nbrobjects=measurements.label(im)
print("对象个数=",nbrobjects)

plt.figure()
plt.imshow(im)
plt.show()

 

 八、交互式标注

from PIL import Image
from pylab import *
import matplotlib.pyplot as plt
import os

im=array(Image.open("101.jpg"))
plt.imshow(im)
print('Click in the image 3 times')

x=ginput(3)
print('你点击了:',x)
plt.show()

 目前仍在报错

九、负片效果:逐像素修改

from PIL import Image
import matplotlib.pyplot as plt

im=array(Image.open('101.jpg'))
plt.figure()
plt.imshow(im)
im2=255-im
plt.figure()
plt.imshow(im2)
plt.show()

 

 十、图片添加文字

import PIL
from PIL import ImageFont
from PIL import Image
from PIL import ImageDraw
 
#初始化字符串
strs = "刘雨昕\n 1997.4.20" 
#模板图片
imageFile = "lyx.jpg"
#新文件保存路径
file_save_dir = r"C:\Users\81244\Desktop\Python practice"
 
#初始化参数
x = 300   #横坐标(左右)
y = 20   #纵坐标(上下)
word_size = 200 #文字大小
word_css  = r"c:\Windows\Fonts\simfang.ttf" #字体文件   行楷

#设置字体,如果没有,也可以不设置
font = ImageFont.truetype(word_css,word_size)
 
#分割得到数组
im1=Image.open(imageFile) #打开图片
draw = ImageDraw.Draw(im1)
print(font.getsize(strs))
draw.text((x, y),strs,(255,255,0),font=font) #设置位置坐标 文字 颜色 字体
        
im1.save('1_resize.jpg', 'jpeg') 
del draw #删除画笔
im1.close()  #关闭图片

 

十一、实现素描效果

素描滤镜的处理关键是对边缘的查找。通过对边缘的查找可以得到物体的线条感。在对图像进行灰度化处理后,我们首先定义一个阈值(threshold)。我们知道素描主要强调的是明暗度的变化,绘制时是斜向方向,通过经验,我们将每个像素点的灰度值与其右下角的灰度值进行比较,当大于这个阈值时,就判断其是轮廓并绘制。

from PIL import Image
import sys
import os
 
def sketch(img, threshold):
    '''
    素描
    param img: Image实例
    param threshold: 介于0到100
    '''
    if threshold < 0: threshold = 0
    if threshold > 100: threshold = 100
     
    width, height = img.size
    img = img.convert('L') # 存为灰度图
    pix = img.load() # 得到像素矩阵
 
    for w in range(width):
        for h in range(height):
            if w == width-1 or h == height-1:
                continue
             
            src = pix[w, h]
            dst = pix[w+1, h+1]
 
            diff = abs(src - dst)
 
            if diff >= threshold:
                pix[w, h] = 0
            else:
                pix[w, h] = 255
 
    return img


path = os.path.dirname("lyx.jpg")
threshold = 10

imageFile = "lyx.jpg"
img = Image.open(imageFile)
img = sketch(img, threshold)
img.save('3_resize.jpg', 'jpeg')

 下面是阈值为15和阈值为10的对比

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值