Ndimage Python: преобразование существующего ndarray в оттенки серого
Во время моего исследования Python 2.7 пытается использовать scipy
Я сделал следующий простой скрипт:
#!/usr/bin/env python
# coding=utf-8
# -*- Mode: python; c-basic-offset: 4 -*-
from scipy import ndimage
import numpy as np
from scipy import misc
import argparse
import Image
def getArguments():
parser = argparse.ArgumentParser(description="An simple Image processor")
parser.add_argument('image_file', metavar="FILENAME", type=str,
help="The image file that will be read In order to be processed")
return parser.parse_args()
def getImagePathFromArguments():
'''
:return: string
'''
args = getArguments()
return args.image_file
def loadImage(image):
'''
:param image: The path of the Image
:return:
'''
return misc.imread(image)
def grayscale(imgData):
#Greyscale action done here
pass
def blur(imgData):
'''
:param nparray imgData:
:return:
'''
return ndimage.gaussian_filter(imgData, 1)
def saveImage(path, imgData):
im = Image.fromarray(imgData)
im.save(path)
def main():
imagePath = getImagePathFromArguments()
print "Loading Image from %s" % (imagePath,)
image = loadImage(imagePath)
while True:
print "Select \n"
print "1. Greyscale"
print "2. Bluring"
option = int(raw_input("Please do your option: "))
if (option != 1 and option != 2):
print "Wrong Option"
else:
processedData=0
if option == 1:
processedData = grayscale(image)
elif option == 2:
print "Bluring Image"
processedData = blur(image)
saveImagePath = raw_input("Where to you want to store the image?")
saveImage(saveImagePath, processedData)
break
if __name__ == "__main__":
main()
Это делает простой процесс на изображениях, таких как размытие и оттенки серого. Мне удалось сделать размытие из уже загруженного изображения, но как насчет оттенков серого?
Самое близкое, что я нашел, - Как я могу преобразовать изображение RGB в оттенки серого в Python? Но они не дают решения с помощью ndimage.
Также ndimage может конвертировать во время открытия и без использования уже открытого изображения.
Я также пытался реализовать метод greyscale
как показано в http://ebanshi.cc/questions/108516/convert-rgb-image-to-grayscale-in-python:
def grayscale(imgData):
r=imgData[:,:,0]
g=imgData[:,:,1]
b=imgData[:,:,2]
return r * 299. / 1000 + g * 587. / 1000 + b * 114. / 1000
Но я получаю следующую ошибку:
Трассировка (последний вызов был последним): файл "/home/pcmagas/Kwdikas/python/Basic/scripy/scipy_image_examples.py", строка 83, в файле main() "/ home / pcmagas / Kwdikas / python / Basic / scripy / scipy_image_examples.py ", строка 78, в основном файле saveImage(saveImagePath, processingData)" /home/pcmagas/Kwdikas/python/Basic/scripy/scipy_image_examples.py ", строка 52, в файле saveImage im.save(path)"/usr/lib/python2.7/dist-packages/PIL/Image.py", строка 1675, в файле сохранения save_handler(self, fp, filename) Файл"/usr/lib/python2.7/dist-packages/PIL/PngImagePlugin.py", строка 682, в _save повысить IOError(" невозможно записать режим%s как PNG" % mode) IOError: невозможно записать режим F как PNG
Есть идеи?
2 ответа
В конце концов мне нужно было создать свою собственную функцию. Это было не так сложно
def grayscale(imgData):
r=imgData[:,:,0]
g=imgData[:,:,1]
b=imgData[:,:,2]
return r/3 + g /3 + b/3
Димитрис, ваше решение не работает, потому что вы пытаетесь сохранить файл в недопустимом режиме. F для 32-битных пикселей с плавающей точкой и при вызове saveImage
данные изображения все еще находятся в режиме F. Вы можете проверить сами, добавив строку: print im.mode
в saveImage
функция.
См. http://pillow.readthedocs.io/en/3.4.x/handbook/concepts.html для всех режимов библиотеки PIL.
Чтобы это исправить, вам просто нужно снова преобразовать данные изображения в режим RGB, вызвав convert('RGB')
перед сохранением.