【发布时间】:2018-09-23 02:41:10
【问题描述】:
我生成了这样的纹理图像
我必须比较两个纹理。我使用了直方图比较法。
image_file = 'output_ori.png'
img_bgr = cv2.imread(image_file)
height, width, channel = img_bgr.shape
hist_lbp = cv2.calcHist([img_bgr], [0], None, [256], [0, 256])
print("second started")
image_fileNew = 'output_scan.png'
img_bgr_new = cv2.imread(image_fileNew)
height_new, width_new, channel_new = img_bgr_new.shape
print("second lbp")
hist_lbp_new = cv2.calcHist([img_bgr_new], [0], None, [256], [0, 256])
print("compar started")
compare = cv2.compareHist(hist_lbp, hist_lbp_new, cv2.HISTCMP_CORREL)
print(compare)
但是这种方法无效。它显示了两种不同图像纹理的相似结果。此外,它也没有显示出太多的变化来识别打印和扫描效果。如何比较纹理?我想到了分析 GLCM 的特性。
import cv2
import numpy as np
from skimage.feature import greycomatrix
img = cv2.imread('images/noised_img1.jpg', 0)
image = np.array(img, dtype=np.uint8)
g = greycomatrix(image, [1, 2], [0, np.pi/2], levels=4, normed=True, symmetric=True)
contrast = greycoprops(g, 'contrast')
print(contrast)
在这种方法中,我得到的输出是 2*2 矩阵。如何比较具有对比度、相似性、同质性、ASM、能量和相关性等多个特征的两个矩阵?
评论澄清
import numpy as np
from PIL import Image
class LBP:
def __init__(self, input, num_processes, output):
# Convert the image to grayscale
self.image = Image.open(input).convert("L")
self.width = self.image.size[0]
self.height = self.image.size[1]
self.patterns = []
self.num_processes = num_processes
self.output = output
def execute(self):
self._process()
if self.output:
self._output()
def _process(self):
pixels = list(self.image.getdata())
pixels = [pixels[i * self.width:(i + 1) * self.width] for i in range(self.height)]
# Calculate LBP for each non-edge pixel
for i in range(1, self.height - 1):
# Cache only the rows we need (within the neighborhood)
previous_row = pixels[i - 1]
current_row = pixels[i]
next_row = pixels[i + 1]
for j in range(1, self.width - 1):
# Compare this pixel to its neighbors, starting at the top-left pixel and moving
# clockwise, and use bit operations to efficiently update the feature vector
pixel = current_row[j]
pattern = 0
pattern = pattern | (1 << 0) if pixel < previous_row[j-1] else pattern
pattern = pattern | (1 << 1) if pixel < previous_row[j] else pattern
pattern = pattern | (1 << 2) if pixel < previous_row[j+1] else pattern
pattern = pattern | (1 << 3) if pixel < current_row[j+1] else pattern
pattern = pattern | (1 << 4) if pixel < next_row[j+1] else pattern
pattern = pattern | (1 << 5) if pixel < next_row[j] else pattern
pattern = pattern | (1 << 6) if pixel < next_row[j-1] else pattern
pattern = pattern | (1 << 7) if pixel < current_row[j-1] else pattern
self.patterns.append(pattern)
def _output(self):
# Write the result to an image file
result_image = Image.new(self.image.mode, (self.width - 2, self.height - 2))
result_image.putdata(self.patterns)
result_image.save("output.png")
我用这段代码生成了纹理。我有纹理,我有计算纹理属性的方法,但问题是如何识别两个纹理之间的相似性。
【问题讨论】:
-
您在问题标题中使用了“LBP”。 LBP (or any of its variants) 是比较纹理的好方法。为什么问题的主体根本不谈论 LBP?相反,您谈论的是直方图,它根本不表征纹理,而 GLCM,在过去 25 年的每次测试中都被 LBP 和其他方法吹出了水面。
-
我使用 LBP 生成纹理。现在的任务是比较两个纹理。为了比较,我谈到了 GLCM。从您的回答中,我可以理解的是:我们可以使用 LBP 比较纹理。我对吗?情况如何?
-
LBP(局部二进制模式)是一种表征纹理的方法。我不知道你是如何使用它们来生成纹理的?如果您在 Google 上搜索“LBP 纹理”,您将获得大量论文、软件文档等,这将进一步帮助您。 SciKit 和 OpenCV(您为其添加了标签)都有实现。
-
这就是我理解您正在做的事情:您从一些图像开始,计算 LBP,但不是在直方图中累积每个像素的值,而是将其输出为(二进制?)图片。然后你想使用不同的纹理表征技术来量化这些。这解释了您使用直方图的原因。
-
我建议你计算
LBP.patterns的直方图(不要转换成图像,因为数据类型转换会导致问题!)。查看 LBP 文献。有一些方法可以进一步减少 256 个不同的值,这可能对您的情况有用,因为生成的特征将具有更少的维度并且更容易比较。
标签: python image-processing scikit-image glcm lbph-algorithm