Python图像自卷积消除纹理

 这里选用了scipy中的ndimage.convolve作为卷积函数,输入参数为被卷积图像和卷积核。

因为是要消除图像自身的纹理,所以对卷积的核要求比较大,尽量要大于17,但也不能太大,会过于模糊。

步骤是先将图像转为灰度图,随机选取和卷积核大小相同的正方形框小图像,尽量选取多个图像,取平均值,保证纹理特征能够适应整张图片。得出的最终小图像之后取加权平均值,类似于高斯模糊一样的效果,这样卷积出来的结果就能有效的消除图像纹理。

这样做的好处就是能够消除图像普遍性的纹理,但是对于特殊的纹理(瑕疵)能够有很好的保留,比起其他的平滑滤波算法有一定的优势。

import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
from scipy import ndimage


cov_len = 23 # 尽量选取比较大的卷积核
img = Image.open("20180706120408263.jpg", 'r')
img = img.convert('L')
avg_img = []
for i in range(19): #循环次数不限,尽量不要太多
    px = np.random.randint(0, 256 - cov_len)
    py = np.random.randint(0, 256 - cov_len)
    rect = (px, py, px + cov_len, py + cov_len)
    cut_img = img.crop(rect)
    avg_img.append(np.array(cut_img).reshape(-1))
avg_img = np.array(avg_img).mean(axis=0).reshape(cov_len, cov_len)

avg_img = avg_img / avg_img.sum() # 加权平均

i = ndimage.convolve(img, avg_img)
img_result = Image.fromarray(i)
img_result.save('6.png')
plt.imshow(img_result, cmap='gray')
plt.show()

卷积前:

Python图像自卷积消除纹理_第1张图片

卷积后:

Python图像自卷积消除纹理_第2张图片

查找直线:

Python图像自卷积消除纹理_第3张图片

你可能感兴趣的:(python)