为什么 python 中的像素值会自动变化?
Why the automatic change in pixel value in python?
我正在借助 VideoCapture 从视频中提取帧。
提取第一帧,借助 PIL 将帧转换为图像。
在位置 (1,1) 打印上一个像素值
打印新创建图像的位置 (1,1) 处的像素值
谁能解释一下为什么?
提取帧的函数
import cv2
from PIL import Image
def FrameCapture(path):
# Path to video file
vidObj = cv2.VideoCapture(path)
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
width = cv2.CAP_PROP_FRAME_WIDTH
height = cv2.CAP_PROP_FRAME_HEIGHT
fps = cv2.CAP_PROP_FPS
out = cv2.VideoWriter("D:\Funny 3 second video.mp4", fourcc, fps, (width, height))
cnt = int(0)
while 1:
# vidObj object calls read
# function extract frames
success, arrayframe = vidObj.read()
if success == 0:
break
if cnt == 0:
#IF FIRST FRAME SAVE IT
sp = Image.fromarray(arrayframe)
sp.save("D:\sp2.jpg")
fp = "D:\sp2.jpg"
im = Image.open(fp, mode='r')
im = im.convert('RGB')
print("Old Value: ",arrayframe[1][1])
print("New Value: ",im.getpixel((1, 1)))
out.write(arrayframe)
cnt += 1
vidObj.release()
out.release()
cv2.destroyAllWindows()
# Driver Code
if __name__ == '__main__':
# Calling the function
FrameCapture("D:\Funny 2 second video.mp4")
输出
Old Value: [94 95 90]
New Value: (94, 95, 89)
答案很简单。您以有损格式(即 JPEG)保存数据,并且丢失了数据。
如果每一位都对您很重要,请使用 PNG 等无损格式。
我正在借助 VideoCapture 从视频中提取帧。 提取第一帧,借助 PIL 将帧转换为图像。 在位置 (1,1) 打印上一个像素值 打印新创建图像的位置 (1,1) 处的像素值 谁能解释一下为什么?
提取帧的函数
import cv2
from PIL import Image
def FrameCapture(path):
# Path to video file
vidObj = cv2.VideoCapture(path)
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
width = cv2.CAP_PROP_FRAME_WIDTH
height = cv2.CAP_PROP_FRAME_HEIGHT
fps = cv2.CAP_PROP_FPS
out = cv2.VideoWriter("D:\Funny 3 second video.mp4", fourcc, fps, (width, height))
cnt = int(0)
while 1:
# vidObj object calls read
# function extract frames
success, arrayframe = vidObj.read()
if success == 0:
break
if cnt == 0:
#IF FIRST FRAME SAVE IT
sp = Image.fromarray(arrayframe)
sp.save("D:\sp2.jpg")
fp = "D:\sp2.jpg"
im = Image.open(fp, mode='r')
im = im.convert('RGB')
print("Old Value: ",arrayframe[1][1])
print("New Value: ",im.getpixel((1, 1)))
out.write(arrayframe)
cnt += 1
vidObj.release()
out.release()
cv2.destroyAllWindows()
# Driver Code
if __name__ == '__main__':
# Calling the function
FrameCapture("D:\Funny 2 second video.mp4")
输出
Old Value: [94 95 90]
New Value: (94, 95, 89)
答案很简单。您以有损格式(即 JPEG)保存数据,并且丢失了数据。
如果每一位都对您很重要,请使用 PNG 等无损格式。