python修改图像颜色

这篇博客介绍了如何利用OpenCV和PIL库在Python中获取图像像素值,并展示了如何根据指定坐标修改图像像素。通过设置鼠标回调函数,可以实时获取点击的像素坐标及其RGB值,并在图像上显示。此外,还提供了两个函数,一个用于直接修改指定像素点的颜色,另一个则根据颜色范围批量修改像素。
摘要由CSDN通过智能技术生成

环境:
opencv-python 4.5.2.52
numpy 1.20.2
Pillow 8.2.0
python 3.9.2

1.获取图像像素值

摘自:https://blog.csdn.net/m0_46413170/article/details/117001451

import cv2

def get_point(event, x, y, flags, param):
    # 鼠标单击事件
    if event == cv2.EVENT_LBUTTONDOWN:
        # 输出坐标
        print('坐标值: ', x, y)
        # 在传入参数图像上画出该点
        #cv2.circle(param, (x, y), 1, (255, 255, 255), thickness=-1)
        img = param.copy()
        # 输出坐标点的像素值
        #print('像素值:',param[y][x]) # 注意此处反转,(纵,横,通道)
        pix=param[y][x][::-1]#以RGB顺序输出
        print('像素值:',pix) # 注意此处反转,(纵,横,通道)
        # 显示坐标与像素
        text = "("+str(x)+','+str(y)+')'+str(param[y][x])
        cv2.putText(img,text,(0,param.shape[0]),cv2.FONT_HERSHEY_PLAIN,1.5,(0,0,255),1)
        cv2.imshow('image', img)
        cv2.waitKey(0)

if __name__ == "__main__":
    # 定义两幅图像
    image = cv2.imread('del.png')
    # image = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)

    # 定义两个窗口 并绑定事件 传入各自对应的参数
    cv2.namedWindow('image')
    cv2.setMouseCallback('image', get_point, image)

    # 显示图像
    while(True):
        cv2.imshow('image', image)
        if cv2.waitKey(20) & 0xFF == 27:
            break



2.修改图像像素值

由1中获得的像素点的坐标以及像素点值作为下述函数的相关输入

from PIL import Image
def pixelModify(in_add,out_add,color_in,color_out,x1=None,y1=None,x2=None,y2=None):
    img = Image.open(in_add)     #读取照片
    width = img.size[0]          #长度
    height = img.size[1]         #宽度
    if (x1 is None or y1 is None or x2 is None or y2 is None):
        x1,y1=0,0
        x2,y2=width,height
    if(x1>width or x1<0 or x2>width or x2<0):
        print("x fuck")
        return None
    elif(y1>height or y1 <0 or y2>height or y2<0):
        print("y fuck")
        return None
    elif(x2<x1):
        x1,x2=x2,x1
    elif(y2<y1):
        y1,y2=y2,y1
    for i in range(x1,x2):     #遍历所有长度的点
        for j in range(y1,y2):#遍历所有宽度的点
            pixel=img.getpixel((i,j))
            #因为会得到RGBA四个通道,只取前三个通道。第四个通道代表“透明度”,255表示正常的不透明
            pixel=pixel[:3]
            if pixel==color_in:
                img.putpixel((i,j),color_out)
    print("success!")
    img.save(out_add)            #保存修改像素点后的图片
if __name__=="__main__":       
    in_add='del.png'             #输入图像地址
    out_add='del_out.png'        #输出图像地址
    color_in=(255,255,255)         #需要被修改的像素点的RGB值,顺序为RGB
    color_out=(0,0,0)            #最终修改成的像素点的RGB值
    color_out=(0,0,0,255)        #255代表透明度,0表示完全透明,有没有均可

    #并不需要满足x1<x2,y1<y2,只需要在像素范围内即可
    x1,y1=324,270       #左下角坐标点
    x2,y2=415,320       #右上角坐标点

    #将指定范围内的图像像素更改:等于color_in的改为color_out
    #其中参数x1,y1,x2,y2可有可无,不指定上述四位参数时,默认在整个图像中寻找并替换 
    pixelModify(in_add,out_add,color_in,color_out,x1,y1,x2,y2)



进一步,将一定阈值内的颜色更改为某一确定颜色:

from PIL import Image
def pixelModify(in_add,out_add,color_min,color_max,color_out,x1=None,y1=None,x2=None,y2=None):
    img = Image.open(in_add)     #读取照片
    width = img.size[0]          #长度
    height = img.size[1]         #宽度

    if (x1 is None or y1 is None or x2 is None or y2 is None):
        x1,y1=0,0
        x2,y2=width,height
    elif(x1>width or x1<0 or x2>width or x2<0):
        print("x fuck")
        return None
    elif(y1>height or y1 <0 or y2>height or y2<0):
        print("y fuck")
        return None
    elif(x2<x1):
        x1,x2=x2,x1
    elif(y2<y1):
        y1,y2=y2,y1
    for i in range(x1,x2):     #遍历所有长度的点
        for j in range(y1,y2):#遍历所有宽度的点
            pixel=img.getpixel((i,j))
            #因为会得到RGBA四个通道,只取前三个通道。第四个通道代表“透明度”,255表示正常的不透明
            pixel=pixel[:3]
            if (pixel[0]>=color_min[0] and pixel[1] >= color_min[1] and pixel[2] >= color_min[2]):
                if (pixel[0]<=color_max[0] and pixel[1] <= color_max[1] and pixel[2] <= color_max[2]):
                    img.putpixel((i,j),color_out)
    print("success!")
    img.save(out_add)            #保存修改像素点后的图片
if __name__=="__main__":       
    in_add='1.png'             #输入图像地址
    out_add='1_out1.png'        #输出图像地址
    color_min=(140,50,20)         #需要被修改的像素点的RGB值,顺序为RGB
    color_max=(250,233,226)      
    color_out=(0,0,0)            #最终修改成的像素点的RGB值
    pixelModify(in_add,out_add,color_min,color_max,color_out)
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Greate AUK

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值