到目前为止,我已经将图像划分为特定大小的块,这些块具有原始块的平均颜色。现在,我必须基于它们的相似性来合并这些块,其中每个块都包含一个像素值(平均颜色值)。为此,我一直在尝试根据像素的rgb值合并图像中的像素。到目前为止,我还没有发现任何可以帮助我解决这个问题的方法。所以请帮助我解决这个问题。到目前为止我所做的...
x和y是块大小。在此,x = y = 16。
输入:Original Image 输出:Processed image 在此之后,我不执行任何操作,因为我不知道如何继续进行。现在,我必须根据相似度对处理后的图像中的像素进行分组。
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)
答案 0 :(得分:0)
您已经使用了很多代码来完成第一步,但是,在2-3行代码中使用numpy函数可以实现相同的输出,如下所示:
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)
答案 1 :(得分:0)
我的代码可能不是最佳的,但是效果很好。
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)