ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

OpenCV-python小玩意27 如何做灰度、增强锐化、黑白等滤镜

OpenCV-python小玩意27 如何做灰度、增强锐化、黑白等滤镜 0. 我要做什么OpenCV-python小玩意这个系列半年没有更新了感叹时光荏苒岁月如梭-。今天换个轻松的玩法给一张本地图片套上滤镜。手机修图软件里那些「灰度」「黑白」「锐化」「增强」底层很多就是图像处理里的常规操作。OpenCV也能做而且几行代码就能跑通。所以老规矩今天的目标是用imread读入一张图按数字键切换滤镜预览效果按s还能把当前效果存下来。顺便把几个常用滤镜的原理和实现说一说。1. 滤镜到底是什么滤镜听起来很玄其实就是对每个像素或一块邻域按某种规则重新算一遍颜色。滤镜本质上在干什么常用手段灰度丢掉颜色只留亮度cvtColor黑白灰度后再拉对比度更像「胶片黑白」灰度 CLAHE / 对比度拉伸锐化加强边缘让细节更突出卷积核filter2D增强提亮、拉对比convertScaleAbs/ CLAHE柔化抹平细节高斯模糊反色颜色取反bitwise_not怀旧偏黄棕的复古色颜色矩阵变换《小玩意4》里灰度化是为了预处理今天换个角度——把它当成拍照滤镜来玩。2. 灰度滤镜灰度最熟让我们再回忆一下。彩色图是 BGR 三通道灰度是单通道亮度[Y 0.299R 0.587G 0.114B]graycv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)# 预览时转回三通道方便和其他滤镜拼在一起显示gray_bgrcv2.cvtColor(gray,cv2.COLOR_GRAY2BGR)效果如下3. 黑白滤镜比灰度更直接这叫我的世界里没有灰色地带非黑即白很多人把「灰度」和「黑白」混着叫。严格说灰度0~255 连续灰阶偏「技术处理」黑白滤镜往往还要拉对比、压中间调阴影更黑、高光更亮才像手机里的「黑白」一个好用的做法是先转灰度再用CLAHE自适应直方图均衡把局部对比度拉起来。deffilter_bw(frame):graycv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)clahecv2.createCLAHE(clipLimit2.5,tileGridSize(8,8))bwclahe.apply(gray)returncv2.cvtColor(bw,cv2.COLOR_GRAY2BGR)clipLimit越大对比越猛太猛会像「过曝黑白」。效果如下4. 增强滤镜提亮 拉对比增强不一定非要复杂算法。OpenCV 里最直接的是convertScaleAbsdstcv2.convertScaleAbs(src,alpha1.0,beta0)alpha对比度系数1 变硬朗1 变淡beta亮度偏置正数变亮负数变暗deffilter_enhance(frame,alpha1.4,beta20):returncv2.convertScaleAbs(frame,alphaalpha,betabeta)想精细一点可以只在亮度通道上做 CLAHEdeffilter_enhance_clahe(frame):labcv2.cvtColor(frame,cv2.COLOR_BGR2LAB)l,a,bcv2.split(lab)clahecv2.createCLAHE(clipLimit2.0,tileGridSize(8,8))l2clahe.apply(l)lab2cv2.merge([l2,a,b])returncv2.cvtColor(lab2,cv2.COLOR_LAB2BGR)效果如下5. 锐化滤镜边缘更哇塞锐化的经典做法是用卷积核强调中心像素、削弱邻居等价于「原图 边缘」。常用 3×3 锐化核0 -1 0 -1 5 -1 0 -1 0中心是 5四周是 -1加起来还是 1整体亮度大致不变但边缘会被放大。deffilter_sharpen(frame):kernelnp.array([[0,-1,0],[-1,5,-1],[0,-1,0]],dtypenp.float32)returncv2.filter2D(frame,-1,kernel)再介绍一下cv2.filter2Ddstcv2.filter2D(src,ddepth,kernel[,dst[,anchor[,delta[,borderType]]]])参数说明src输入图像ddepth输出深度-1表示与输入相同kernel卷积核浮点矩阵anchor锚点默认核中心delta结果再加的偏置默认 0borderType边界填充方式如果想再猛一点就把中心改成 9、四周全 -1kernel_strongnp.array([[-1,-1,-1],[-1,9,-1],[-1,-1,-1]],dtypenp.float32)还有一种更「自然」的锐化叫USM反锐化掩模先模糊再用原图减模糊得到边缘叠回去。deffilter_usm(frame,amount1.5,radius3):blurcv2.GaussianBlur(frame,(0,0),radius)returncv2.addWeighted(frame,1amount,blur,-amount,0)效果如下6. 再聊聊其他滤镜既然标题写了「等滤镜」哈哈哈那就顺便把其他几个常玩的也补上。6.1 柔化美颜味的糊deffilter_soft(frame):returncv2.GaussianBlur(frame,(15,15),0)6.2 反色deffilter_invert(frame):returncv2.bitwise_not(frame)6.3 怀旧偏棕黄思路对 BGR 做一组线性变换让画面偏暖、偏黄。deffilter_sepia(frame):kernelnp.array([[0.272,0.534,0.131],# B[0.349,0.686,0.168],# G[0.393,0.769,0.189],# R],dtypenp.float32)sepiacv2.transform(frame,kernel)returnnp.clip(sepia,0,255).astype(np.uint8)6.4 浮雕浮雕核强调方向差分画面会像刻在石头上deffilter_emboss(frame):graycv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)kernelnp.array([[-2,-1,0],[-1,1,1],[0,1,2]],dtypenp.float32)embosscv2.filter2D(gray,-1,kernel)128embossnp.clip(emboss,0,255).astype(np.uint8)returncv2.cvtColor(emboss,cv2.COLOR_GRAY2BGR)7. 完整小玩意读取图片切换滤镜把上面串起来。用cv2.imread读本地文件按键切换时反复对同一张原图套滤镜按s可把当前效果保存下来。按键约定按键滤镜0原图1灰度2黑白3增强4锐化5柔化6反色7怀旧8浮雕s保存当前效果q/Esc退出完整代码importcv2importnumpyasnpimportosdeffilter_gray(img):graycv2.cvtColor(img,cv2.COLOR_BGR2GRAY)returncv2.cvtColor(gray,cv2.COLOR_GRAY2BGR)deffilter_bw(img):graycv2.cvtColor(img,cv2.COLOR_BGR2GRAY)clahecv2.createCLAHE(clipLimit2.5,tileGridSize(8,8))bwclahe.apply(gray)returncv2.cvtColor(bw,cv2.COLOR_GRAY2BGR)deffilter_enhance(img,alpha1.4,beta20):returncv2.convertScaleAbs(img,alphaalpha,betabeta)deffilter_sharpen(img):kernelnp.array([[0,-1,0],[-1,5,-1],[0,-1,0]],dtypenp.float32)returncv2.filter2D(img,-1,kernel)deffilter_soft(img):returncv2.GaussianBlur(img,(15,15),0)deffilter_invert(img):returncv2.bitwise_not(img)deffilter_sepia(img):kernelnp.array([[0.272,0.534,0.131],[0.349,0.686,0.168],[0.393,0.769,0.189]],dtypenp.float32)sepiacv2.transform(img,kernel)returnnp.clip(sepia,0,255).astype(np.uint8)deffilter_emboss(img):graycv2.cvtColor(img,cv2.COLOR_BGR2GRAY)kernelnp.array([[-2,-1,0],[-1,1,1],[0,1,2]],dtypenp.float32)embosscv2.filter2D(gray,-1,kernel)128embossnp.clip(emboss,0,255).astype(np.uint8)returncv2.cvtColor(emboss,cv2.COLOR_GRAY2BGR)FILTERS{0:(原图,lambdaf:f.copy()),1:(灰度,filter_gray),2:(黑白,filter_bw),3:(增强,filter_enhance),4:(锐化,filter_sharpen),5:(柔化,filter_soft),6:(反色,filter_invert),7:(怀旧,filter_sepia),8:(浮雕,filter_emboss),}defmain():# 图片路径image_pathimages/test.jpgimgcv2.imread(image_path)ifimgisNone:print(f无法读取图片:{image_path})returnmode0print(按 0-8 切换滤镜s 保存q/Esc 退出)whileTrue:name,fnFILTERS[mode]outfn(img)showout.copy()cv2.putText(show,f[{mode}]{name},(20,40),cv2.FONT_HERSHEY_SIMPLEX,1.0,(0,255,0),2)cv2.imshow(OpenCV Image Filters,show)# waitKey(0)等按键再刷新适合静态图片keycv2.waitKey(0)0xFFifkeyin(ord(q),27):breakiford(0)keyord(8):modekey-ord(0)ifkeyord(s):stemos.path.splitext(os.path.basename(image_path))[0]save_pathf{stem}_{name}.jpgcv2.imwrite(save_path,out)print(f已保存:{save_path})cv2.destroyAllWindows()if__name____main__:main()把image_path换成你的图就能玩。想实时预览的话另有摄像头版脚本可对照。效果如下8. 一点小总结你想要的感觉优先试去色、省事灰度更有「照片感」的黑白灰度 CLAHE画面闷、想提精神convertScaleAbs/ LABCLAHE糊、细节发虚锐化核 / USM玩味、做特效反色、怀旧、浮雕参数是滤镜的灵魂同一套核换个alpha、换个clipLimit气质就会不一样。文中使用的测试图片是主打高清免费无水印的扫描小程序「程序员Linc表格识别」上去直接就可以使用嘎嘎好使。最新版本的扫描功能已经支持了导出增强锐化、黑白、加深、灰度等PDF原理上与上述滤镜甚是相近。欢迎大家使用。有什么需要讨论的我们评论区见参考OpenCV: Changing ColorspacesOpenCV: Image FilteringOpenCV: Histograms - Equalization#OpenCV #python #滤镜 #图像处理 #锐化
返回列表