环境:
opencv-python 4.5.2.52
numpy 1.20.2
Pillow 8.2.0
python 3.9.2
1.获取图像像素值
摘自:https://blog.youkuaiyun.com/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)
这篇博客介绍了如何利用OpenCV和PIL库在Python中获取图像像素值,并展示了如何根据指定坐标修改图像像素。通过设置鼠标回调函数,可以实时获取点击的像素坐标及其RGB值,并在图像上显示。此外,还提供了两个函数,一个用于直接修改指定像素点的颜色,另一个则根据颜色范围批量修改像素。
546





