我有一个python脚本,它使用OpenCV打开一个图像文件(.png或.ppm),然后将所有RGB值加载到一个多维Python数组(或列表)中,单独在Python数组上执行一些逐像素计算(在这个阶段根本不使用OpenCV ),然后使用新创建的数组(包含新的RGB值)再次使用OpenCV编写新的图像文件(这里是.png)。在这个脚本中根本没有使用Numpy。该程序运行良好。
问题是如何在不使用任何外部库的情况下做到这一点,无论它们是否用于图像处理(例如OpenCV、Numpy、Scipy、Pillow等)。总而言之,我需要使用Python的内部模块: 1.打开图像并读取RGB值,2.从预先计算的RGB值写入新图像。出于这个目的,我将使用Pypy而不是CPython,以提高速度。注:我使用Windows10,如果这很重要的话。
发布于 2018-07-22 03:55:43
你可以在没有OpenCV或numpy或任何讨厌你的东西的情况下编写这样的PPM
文件:-
import array
width,height = 800,600
PPMheader = 'P6\n' +str(width) + ' ' +str(height) + '\n255\n'
# Create and fill a red PPM image
image = array.array('B', [255, 0, 0] * width * height)
# Save as PPM image
with open('result.ppm', 'wb') as f:
f.write(bytearray(PPMheader, 'ascii'))
image.tofile(f)
我也写了一个非常简单的PPM阅读器-它只读取与上面所写的匹配的24位P6 PPM文件。我猜它可以被充实以处理注释、16位数据和灰度数据,但这是一个开始:
#!/usr/local/bin/python3
import array
def ppmread(filename):
with open(filename, 'rb') as f:
# Read first line - expecting "P6"
line = f.readline().decode('latin-1')
if not line.startswith('P6'):
print("ERROR: Expected PPM file to start with P6")
return False
# Read second line - expecting "width height"
line = f.readline().decode('latin-1')
dims = line.split()
width,height=int(dims[0]),int(dims[1])
# Read third line - expecting "255"
line = f.readline().decode('latin-1')
if not line.startswith('255'):
print("ERROR: Expected 8-bit PPM with MAXVAL=255")
return False
image= f.read(width*height*3)
ppmread('test.ppm')
在终端中使用ImageMagick将PPM转换为PNG或JPEG:
convert result.ppm -auto-level image.png
或者:
convert result.ppm -resize 1024x768 image.jpg
同样,在终端中使用ImageMagick将JPEG转换为PPM:
convert image.jpg -depth 8 image.ppm
发布于 2018-07-22 01:58:51
处理基本的.ppm文件很简单:您有三行文本(P6
、"width height“、255
),然后是3*width*height
字节。只要不需要更复杂的.ppm格式变体,就可以分别用5行代码编写一个加载器和一个保存器。
发布于 2018-07-22 02:17:40
您可以像打开文本文件一样打开图像文件。只需适应.png镜像的约定即可。
对于PNG,请查看https://fr.wikipedia.org/wiki/Portable_Network_Graphics并相应地阅读这些块
https://stackoverflow.com/questions/51457993
复制相似问题