Как объединить пиксели в изображение на основе их значений RGB в Python? - PullRequest
0 голосов
/ 10 октября 2018

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

x и y - размеры блоков.Здесь х = у = 16.

Входные данные: Исходное изображение Выходные данные: Обработанное изображение После этого я ничего не реализовал, поскольку не знаю, как действовать дальше.Теперь я должен сгруппировать пиксели в обработанном изображении на основе их сходства.

i=0
j=0
m=16
n=16

l=[]   
data = np.zeros( (256,256,3), dtype=np.uint8 )
while(m<=256):
    while(n<=256):
        l=image[i:m,j:n]

        print(l)
        r=0
        g=0
        b=0
        for q in range(len(l)):
            for w in range(len(l)):
                r=r+l[q][w][0]
                g=g+l[q][w][1]
                b=b+l[q][w][2]

        r=r/(x*y)
        b=b/(x*y)
        g=g/(x*y)
        k=[r,g,b]
        data[i:m,j:n]=k
        j=j+16
        n=n+16

    i=i+16
    m=m+16
    j=0
    n=16
img = smp.toimage( data )
data1 = np.asarray( img, dtype="int32" )


cv2.imwrite(os.path.join('G:/AI package/datasets/_normalized',filename),data1)

Ответы [ 2 ]

0 голосов
/ 13 октября 2018

Мой код может быть неоптимальным, но он работает просто отлично.

import cv2
import numpy as np
import scipy.misc as smp
import os


l=[]   
res = np.zeros( (256,256,3), dtype=np.uint8 )
while(m<=256):
    while(n<=256):
        l=image[i:m,j:n][0][0]
        low=np.array([l[0] - thresh, l[1] - thresh, l[2] - thresh])
        high=np.array([l[0] + thresh, l[1] + thresh, l[2] + thresh])
        mask1=cv2.inRange(image,low,high)
        res = cv2.bitwise_and(image, image, mask = mask1)
        block=0
        a=i
        b=j
        c=m
        d=n
        k=[]
        b=b+x
        d=d+x
        while(b<256 and d<256):
            k=res[a:c,b:d][0][0]
            black=[0,0,0]
            while((k!=black).all() and b<256 and d<256):
                block=block+1
                b=b+x
                d=d+x
                k=res[a:c,b:d][0][0]
            image[i:m,j+x:(n+((block)*x))]=l
            break
        j=j+x
        n=n+y

    i=i+x
    m=m+y
    j=0
    n=x
image= cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
img = smp.toimage( image )
data1 = np.asarray( img, dtype="int32" )
cv2.imwrite(os.path.join('G:/AI package/datasets/btob/',filename),data1)
0 голосов
/ 10 октября 2018

Вы использовали довольно много кода, чтобы выполнить первый шаг, однако, тот же результат может быть достигнут с помощью простых функций в пределах 2-3 строк кода, как:

import cv2
import numpy as np


def get_mean_color(box):
    return int(np.mean(box[:, :, 0])), int(np.mean(box[:, :, 1])), int(np.mean(box[:, :, 2]))


def get_super_square_pixels(img, super_pix_width):
    height, width, ch = img.shape

    if height % super_pix_width != 0:
        raise Exception("height must be multiple of super pixel width")

    if width % super_pix_width != 0:
        raise Exception("width must be multiple of super pixel width")

    output_img = np.zeros(img.shape, np.uint8)
    for i in xrange(height / super_pix_width):
        for j in xrange(width / super_pix_width):
            src_box = img[i * super_pix_width:(i + 1) * super_pix_width, j * super_pix_width:(j + 1) * super_pix_width]
            mean_val = get_mean_color(src_box)

            output_img[i * super_pix_width:(i + 1) * super_pix_width, j * super_pix_width:(j + 1) * super_pix_width] = mean_val

    return output_img

img = cv2.imread("/path/to/your/img.jpg")
out = get_super_square_pixels(img, 16)
...