这里选用了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()
卷积前:

卷积后:

查找直线:

本文介绍了一种使用scipy库中的convolve函数消除图像普遍性纹理的方法。通过将图像转换为灰度图,并从图像中随机选取多个与卷积核大小相同的小区域进行加权平均,以创建一个适用于整张图片的模糊效果。该方法能够有效去除普通纹理同时保留特殊纹理特征。
310

被折叠的 条评论
为什么被折叠?



