导读:过几天就是清明节了。传统节日,特别是一个放假的传统节日,我觉得有必要安排一下。最近在研究查找表以及滤镜的实现,正好赶上了……
作者:神秘的铁头娃
来源:AI算法与图像处理(ID:AI_study)
清明节,又称踏青节、行清节、三月节、祭祖节,节期在仲春与暮春之交。清明兼具自然与人文两大内涵,既是自然节气点,也是传统节日。 清明节的节俗丰富,扫墓祭祖与踏青郊游是清明节的两大礼俗主题,这两大传统礼俗主题在中国自古传承,至今不辍。 ——嗯,没错,百度百科说的
说起“清明节”,我想大家一定会想到《清明上河图》,但是我一百度,其实“清明节”和《清明上河图》是无关的,具体的可以去百度了解一哈。
清明上河图,中国十大传世名画之一。为北宋风俗画,北宋画家张择端仅见的存世精品,属国宝级文物,现藏于北京故宫博物院。
清明上河图宽24.8厘米、长528.7厘米,绢本设色。作品以长卷形式,采用散点透视构图法,生动记录了中国十二世纪北宋都城东京(又称汴京,今河南开封)的城市面貌和当时社会各阶层人民的生活状况,是北宋时期都城汴京当年繁荣的见证,也是北宋城市经济情况的写照。
LUT(look up table)基本思想是查表,既将矩阵中所有可能遇到的值都计算一遍储存在数组中,在遍历过程中只是将对应的查表值进行赋值即可,这样可以避免大量的重复计算,这是典型的使用存储空间换取速度的做法。
例如以下图展示了一个查找表实现将低对比度的图转变为高对比度的原理图:
▲原图
▲加滤镜后的效果图
我们都知道常见的色彩空间有RGB、CMY、HSV等等,其中最经常用到的当属RGB了,当然这些色彩空间之间是可以互相转换的。
RGB色彩空间源于使用阴极射线管(CRT)的彩色电视。RGB色彩空间是相对色彩标准的一个例子。基色(R-红,G-绿,B-蓝)模拟在CRT荧光材料中的荧光物质。RGB模型使用加性色彩混合以获知需要发出什么样的光来产生给定的色彩。具体色彩的值用三个元素的向量来表达——三个基色的亮度。
而滤镜实际上就是通过对RGB三个通道的值进行一定的运算得到一个新的值,然后再显示出来。
例如,“流年”滤镜就是通过对R通道的数值开平方,然后乘以一个参数得到的结果,其他通道的值保持不变。
实际上就是类似于LUT(查找表)所实现的功能。
为了让大家能够重现效果并理解底层的原理,这里使用了三种方法进行实现分别如下所示:
1. 对图像的三个通道亮度值进行直接修改的方法实现——实现“流年”滤镜效果
思路:
def fleeting(self):
src=Image.open(self.path)
src.show()
img=np.asarray(Image.open(self.path).convert('RGB'))
img1=np.sqrt(img*[1.0,0.0,0.0])*self.params
img2=img*[0.0,1.0,1.0]
img=img1+img2
img=Image.fromarray(np.array(img).astype('uint8'))
img.show()
▲原图
▲“流年”效果图
2. 利用opencv中的函数实现
opencv中可以直接调用:
cv2.applyColorMap(img, cv2.COLORMAP)
# 其中img为输入图片,cv2.COLORMAP为可选的效果
如下所示:可以将cv2.COLORMAP替换为下面的英文单词或者对应的数字皆可。
cv2.applyColorMap(img, cv2.COLORMAP_COLL)
▲cool风格的清明上河图
3. 利用PIL中函数实现
PIL中通过调用filter函数,参数传递ImageFilter下的滤镜参数即可实现各种滤镜效果的图案。
def lut_PIL(self):
src=Image.open(self.path)
im2 = src.filter(ImageFilter.BLUR) # 模糊滤镜
im2.save("qm_1.jpg")
im2 = src.filter(ImageFilter.EMBOSS) # 浮雕效果滤镜
im2.save("qm_2.jpg")
im2 = src.filter(ImageFilter.EDGE_ENHANCE) # 凸显边界
im2.save("qm_3.jpg")
im2 = src.filter(ImageFilter.EDGE_ENHANCE_MORE) # 加倍凸显边界
im2.save("qm_4.jpg")
im2 = src.filter(ImageFilter.FIND_EDGES) # 只保留边界
im2.save("qm_5.jpg")
im2 = src.filter(ImageFilter.CONTOUR) # 铅笔画效果
im2.save("qm_6.jpg")
im2 = src.filter(ImageFilter.SMOOTH_MORE) # 平滑滤镜(阀值更大)
img.filter(ImageFilter.EMBOSS) #实现浮雕效果
▲浮雕效果的清明上河图
完整代码: https://github.com/SCUTPZW/opencv/blob/master/LUT_qm