def get_t(J, type, gammaI=1): Jadjusted = natural_histogram_matching(J, type=type)**gammaI # Jadjusted = natural_histogram_matching(J, type=type) texture = Image.open(texture_file_name) texture = np.array(texture.convert("L")) # texture = np.array(texture) texture = texture[99:texture.shape[0] - 100, 99:texture.shape[1] - 100] ratio = texture_resize_ratio * min(J.shape[0], J.shape[1]) / float(1024) texture_resize = interpolation.zoom(texture, (ratio, ratio)) texture = im2double(texture_resize) htexture = hstitch(texture, J.shape[1]) Jtexture = vstitch(htexture, J.shape[0]) size = J.shape[0] * J.shape[1] nzmax = 2 * (size - 1) i = np.zeros((nzmax, 1)) j = np.zeros((nzmax, 1)) s = np.zeros((nzmax, 1)) for m in range(1, nzmax + 1): i[m - 1] = int(math.ceil((m + 0.1) / 2)) - 1 j[m - 1] = int(math.ceil((m - 0.1) / 2)) - 1 s[m - 1] = -2 * (m % 2) + 1 dx = csr_matrix((s.T[0], (i.T[0], j.T[0])), shape=(size, size)) nzmax = 2 * (size - J.shape[1]) i = np.zeros((nzmax, 1)) j = np.zeros((nzmax, 1)) s = np.zeros((nzmax, 1)) for m in range(1, nzmax + 1): i[m - 1, :] = int(math.ceil((m - 1 + 0.1) / 2) + J.shape[1] * (m % 2)) - 1 j[m - 1, :] = math.ceil((m - 0.1) / 2) - 1 s[m - 1, :] = -2 * (m % 2) + 1 dy = csr_matrix((s.T[0], (i.T[0], j.T[0])), shape=(size, size)) Jtexture1d = np.log( np.reshape(Jtexture.T, (1, Jtexture.size), order="f") + 0.01) Jtsparse = spdiags(Jtexture1d, 0, size, size) Jadjusted1d = np.log( np.reshape(Jadjusted.T, (1, Jadjusted.size), order="f").T + 0.01) nat = Jtsparse.T.dot(Jadjusted1d) # lnJ(x) a = np.dot(Jtsparse.T, Jtsparse) b = dx.T.dot(dx) c = dy.T.dot(dy) mat = a + Lambda * (b + c) # lnH(x) # x = spsolve(a,b) <--> a*x = b # lnH(x) * beta(x) = lnJ(x) --> beta(x) = spsolve(lnH(x), lnJ(x)) beta1d = spsolve(mat, nat) # eq.8 beta = np.reshape(beta1d, (J.shape[0], J.shape[1]), order="c") T = Jtexture**beta # eq.9 T = (T - T.min()) / (T.max() - T.min()) img = Image.fromarray(T * 255) # img.show() return T
def get_t(J, type, gammaI=1): ''' 色调渲染(tone rendering): Tone Rendering tone drawing focuses more on shapes, shadow, and shading than on the use of lines 铅笔画的直方图有一定的pattern, 因为只是铅笔和白纸的结合 可以分成三个区域: 1.亮 2.暗 3.居于中间的部分, 于是就有三个用来模拟的模型 亮的部分使用Laplace分布 中间的部分使用平均分布 暗的部分使用高斯分布 随后作者列出了从收集到的简笔画图像中学出来对应的参数 铅笔画的色调 颜色等通过用铅笔重复的涂画来体现 1. 直方图匹配 运用三种分布计算图片的直方图, 然后匹配一个正常图片的直方图 2. 纹理渲染(texture rendering): 计算模拟需要用铅笔重复涂画的次数beta :param J: 图片转换成灰度后的矩阵 :param type: 图片类型 :param gammaI: 控制参数, 值越大最后的结果颜色越深 :return: 色调渲染后的图片矩阵T ''' #直方图匹配 Jadjusted = natural_histogram_matching(J, type=type) ** gammaI # Jadjusted = natural_histogram_matching(J, type=type) #将铅笔纹理图,转换到和待处理图一样的大小 texture = Image.open(texture_file_name) texture = np.array(texture.convert("L")) # texture = np.array(texture) texture = texture[99: texture.shape[0]-100, 99: texture.shape[1]-100] ratio = texture_resize_ratio * min(J.shape[0], J.shape[1]) / float(1024) texture_resize = interpolation.zoom(texture, (ratio, ratio)) texture = im2double(texture_resize) htexture = hstitch(texture, J.shape[1]) Jtexture = vstitch(htexture, J.shape[0]) size = J.shape[0] * J.shape[1] nzmax = 2 * (size-1) i = np.zeros((nzmax, 1)) j = np.zeros((nzmax, 1)) s = np.zeros((nzmax, 1)) for m in range(1, nzmax+1): i[m-1] = int(math.ceil((m+0.1) / 2)) - 1 j[m-1] = int(math.ceil((m-0.1) / 2)) - 1 s[m-1] = -2 * (m % 2) + 1 dx = csr_matrix((s.T[0], (i.T[0], j.T[0])), shape=(size, size)) nzmax = 2 * (size - J.shape[1]) i = np.zeros((nzmax, 1)) j = np.zeros((nzmax, 1)) s = np.zeros((nzmax, 1)) for m in range(1, nzmax+1): i[m-1, :] = int(math.ceil((m-1+0.1)/2) + J.shape[1] * (m % 2)) - 1 j[m-1, :] = math.ceil((m-0.1)/2) - 1 s[m-1, :] = -2 * (m % 2) + 1 dy = csr_matrix((s.T[0], (i.T[0], j.T[0])), shape=(size, size)) # +0.01是为了避免出现有0被进行log运算的情况, 但对正常值影响可以被忽略 Jtexture1d = np.log(np.reshape(Jtexture.T, (1, Jtexture.size), order="f") + 0.01) Jtsparse = spdiags(Jtexture1d, 0, size, size) Jadjusted1d = np.log(np.reshape(Jadjusted.T, (1, Jadjusted.size), order="f").T + 0.01) #构建eq 8,使用Ax=b的形式 nat = Jtsparse.T.dot(Jadjusted1d) # lnJ(x) a = np.dot(Jtsparse.T, Jtsparse) b = dx.T.dot(dx) c = dy.T.dot(dy) mat = a + Lambda * (b + c) # lnH(x) # x = spsolve(a,b) <--> a*x = b # lnH(x) * beta(x) = lnJ(x) --> beta(x) = spsolve(lnH(x), lnJ(x)) # 使用sparse matrix的spsolve 而不是linalg.solve() beta1d = spsolve(mat, nat) # eq.8 beta = np.reshape(beta1d, (J.shape[0], J.shape[1]), order="c") # 模拟素描时通过重复画线来加深阴影, 用pattern Jtexture重复画beta次 T = Jtexture ** beta # eq.9 T = (T - T.min()) / (T.max() - T.min()) img = Image.fromarray(T * 255) # img.show() return T