Как удалить ненужные части изображения, а затем создать новое маленькое изображение с помощью Python? - PullRequest
0 голосов
/ 23 июня 2019

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

enter image description here

Я пытался использовать PIL для чтения изображения. Я не знаю, как установить правильный порог и изменить размер изображения

Ответы [ 2 ]

0 голосов
/ 23 июня 2019

Ниже приведены только черные пиксели, как видно на первом изображении, многие из пикселей, которые вы хотите получить, не являются черными. Вам нужно будет найти способ увеличить то, что вы уберете.

Кроме того, необходимо будет провести исследование свертывания изображения, как видно из моего коллапса. Хотя , это свертывание изображения может сработать, если вам удастся избавиться от всего, кроме красноватых цветов. или Вы можете уменьшить на ширину, как показано на третьем рисунке.

from PIL import Image, ImageDraw


def main():
    picture = Image.open('/Volumes/Flashdrive/Stack_OverFlow/imageprocessing.png', 'r')
    # pix_val = list(im.getdata())
    # print(pix_val)
# https://code-maven.com/create-images-with-python-pil-pillowimg = Image.new('RGB', (100, 30), color = (73, 109, 137))
    blackcount = 0
    pix = picture.convert('RGB')  # https://stackoverflow.com/questions/11064786/get-pixels-rgb-using-pil
    width, height = picture.size
    img = Image.new('RGB', (width, height), color=(73, 109, 137))
    newpic = []
    for i in range(width):
        newpictemp = []
        for j in range(height):
            # https://stackoverflow.com/questions/13167269/changing-pixel-color-python
            r, g, b = pix.getpixel((i, j))
            if r == 0 and g == 0 and b == 0:
                blackcount += 1
            else:
                img.putpixel((i, j), (r, g, b))
                newpictemp.append((r, g, b))
        newpic.append(newpictemp)
    img.save('pil_text.png')
    newheight = int(((width * height) - blackcount) / width)
    print(newheight)
    img2 = Image.new('RGB', (width, newheight), color=(73, 109, 137))
    for i in range(width):
        for j in range(newheight):
            try:
                z = newpic[i][j]
                img2.putpixel((i, j), newpic[i][j])
            except:
                continue
    img2.save('pil_text2.png')


if __name__ == "__main__":
    main()

Нет черных пикселей слева, удалены черные пиксели справа, удалены и изменены по ширине (изменение высоты показано в коде)

0 голосов
/ 23 июня 2019

Я вообще не эксперт в обработке изображений, но дайте мне знать, достаточно ли это для вас.

Если посмотреть на распределение яркости (суммы значений RGB), возможно, один из вариантов - просто отфильтровать пиксели по их значению:

enter image description here

Похоже, что темные части имеют яркость ниже 100 (или что-то в этом роде). Я отфильтровал это так:

from PIL import Image
import numpy as np

def filter_image(img,threshold=100):
    data = np.array(img.convert('RGB'))

    brightness = np.sum(data,axis=2)
    filtered_img = data.copy()*0

    for i in range(data.shape[0]):
        k = 0 # k index the columns that are bright enough
        for j in range(data.shape[1]):
            if brightness[i,j] > threshold:
                filtered_img[i,k,:] = data[i,j,:]
                k += 1 # we increment only if it's bright enough
        # End of column iterator. The right side of the image is black

    return Image.fromarray(filtered_img)

img = Image.open("test.png")
filtered = filter_image(img)
filtered.show()

Я получаю следующий результат. Я уверен, что эксперты могут сделать намного лучше, но это начало:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...