LINUX.ORG.RU

Как массово исправить отдельные пиксели?

 ,


0

1

Мне нужно заменить на нескольких изображениях черные/белые (или почти черные/белые) пиксели на усредненный цвет соседних пикселей. Или хотя бы на указанный вручную цвет.

Кто-нибудь знает, как это сделать с помощью ImageMagick или какой-нибудь другой консольной (чтобы натравить ее на несколько файлов) утилиты?

Ответ на: комментарий от peregrine

Pillow больно уж тормозной…

Обработка изображений весьма легко делается на Rust, вот пример. Берём по координатам пиксели из одного буфера, по ним вычисляем пиксель для нового буфера.

Впрочем, вполне возможно, что задачу и на Imagemagick можно решить… матрицы конволюции он точно умеет, но конволюция здесь не подходит, условие нелинейное.

mertvoprog ()
Ответ на: комментарий от peregrine

Зато компилятор упорно бьёт по рукам, пока не довести код до рабочего состояния. И сообщения об ошибках очень информативные. А питон в лучшем случае выдаст какой-то непонятный эксепшон.

mertvoprog ()

Если речь о единичных пикселах, стоящих либо по диагонали относительно друг друга, либо через один, то это легко поправить свёртками. Легко для человека, не для компьютера :) 18 строк:

#!/usr/bin/python
import sys, cv2, numpy as np

if len(sys.argv) < 5:
    print(f'Usage: {sys.argv[0]} <input> <white threshold> <black threshold> <output>')
    exit(1)

input, th_w, th_b, output = sys.argv[1:5]
kernel = np.array([0, 1]*4 + [0]).reshape((3,3)) / 4

original = cv2.imread(input)

fitered = cv2.filter2D(original, -1, kernel)
gray = cv2.cvtColor(original, cv2.COLOR_BGR2GRAY)
mask = np.logical_or(gray > int(th_w), gray < int(th_b))
result = np.where(mask[:,:,None], fitered, original)

cv2.imwrite(output, result)

Пример запуска:

./remove_flies.py input.png 250 78 output.png

Зависимости: Python 3.6+, NumPy, OpenCV.

anonymous ()