去马赛克(Demosaic)二

2023-11-02 11:10
文章标签 马赛克 demosaic

本文主要是介绍去马赛克(Demosaic)二,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

边缘自适应插值

参考博文图像处理之边缘自适应的插值算法。首先提出从水平和垂直两个方向对绿色分量进行插值重建,先设计由亮度信号的梯度和色度信号的二阶微分构成的边缘检测算子,由边缘检测算子指示沿正确的方向进行绿色分量的插值。红色和蓝色分量的重建使用已经重建好的绿色分量,采用红绿色差空间或蓝色色差空间的线性插值来完成。

在这里插入图片描述

绿色分量重建

\quad\quad 首先恢复红色和蓝色采样点处的绿色分量,以R33为例,水平方向和垂直方向检测算子计算:

h = A B S ( G 32 − G 34 ) + A B S ( 2 R 33 − R 31 − R 35 ) h = ABS(G32-G34)+ABS(2R33-R31-R35) h=ABS(G32G34)+ABS(2R33R31R35)
v = A B S ( G 23 − G 43 ) + A B S ( 2 R 33 − R 13 − R 53 ) v = ABS(G23-G43)+ABS(2R33-R13-R53) v=ABS(G23G43)+ABS(2R33R13R53)

\quad\quad 当水平算子小于垂直算子时,R33存在水平边缘的概率较大,(3,3)处绿色分量的计算沿水平方向进行:
G 33 = G 32 + G 34 2 + 2 R 33 − R 31 − R 35 4 G33 = \frac{G32+G34}{2}+\frac{2R33-R31-R35}{4} G33=2G32+G34+42R33R31R35
\quad\quad 当水平算子大于垂直算子时,R33存在垂直边缘的概率较大,(3,3)处绿色分量的计算沿垂直方向进行,公式如下 :
G 33 = G 23 − G 43 2 + 2 R 33 − R 13 − R 53 4 G33 = \frac{G23-G43}{2}+\frac{2R33-R13-R53}{4} G33=2G23G43+42R33R13R53
\quad\quad 倘若水平和垂直的算子相等,则(3,3)处的绿色分量的计算为水平和垂直方向的平均值,公式如下:
G 33 = G 23 + G 32 + G 34 + G 43 4 + 4 R 33 − R 13 − R 31 − R 35 − R 55 4 G33=\frac{G23+G32+G34+G43}{4}+\frac{4R33-R13-R31-R35-R55}{4} G33=4G23+G32+G34+G43+44R33R13R31R35R55

绿色采样点处的红色和蓝色分量重建

以G43为例,(4,3)处的RB通道:
R 43 = R 33 + R 53 2 + 2 G 43 − G 23 − G 63 2 R43 = \frac{R33+R53}{2}+\frac{2G43-G23-G63}{2} R43=2R33+R53+22G43G23G63
B 43 = B 42 + B 44 2 + 2 G 43 − G 41 − G 45 2 B43 = \frac{B42+B44}{2}+\frac{2G43-G41-G45}{2} B43=2B42+B44+22G43G41G45

红色(蓝色)采样点处的蓝色(红色)分量的重建

以R33为例,(3,3)处的蓝色通道:
D 45 = A B S ( B 24 − B 42 ) + A B S ( 2 G 33 − G 24 − G 42 ) D_{45} = ABS(B24-B42)+ABS(2G33-G24-G42) D45=ABS(B24B42)+ABS(2G33G24G42)
D 135 = A B S ( B 22 − B 44 ) + A B S ( 2 G 33 − G 22 − G 44 ) D_{135} = ABS(B22-B44)+ABS(2G33-G22-G44) D135=ABS(B22B44)+ABS(2G33G22G44)
根据梯度的比较结果,选择合适的插值防线,计算如下:

B 33 = { B 24 + B 42 2 + 2 G 33 − G 24 − G 42 2 , 当 D 45 < D 135 B 22 + B 44 2 + 2 G 33 − G 22 − G 44 2 , 当 D 45 > D 135 B 24 + B 42 + B 22 + B 44 4 + 4 G 33 − G 24 − G 42 − G 22 − G 44 4 , 当 D 45 = = D 135 } B33 = \left\{\begin{align*} &\frac{B24+B42}{2}+\frac{2G33-G24-G42}{2},当D_{45}<D_{135}\\ &\frac{B22+B44}{2}+\frac{2G33-G22-G44}{2},当D_{45}>D_{135}\\ &\frac{B24+B42+B22+B44}{4}+\frac{4G33-G24-G42-G22-G44}{4},当D_{45}==D_{135} \end{align*} \right\} B33= 2B24+B42+22G33G24G42,D45<D1352B22+B44+22G33G22G44,D45>D1354B24+B42+B22+B44+44G33G24G42G22G44,D45==D135

function Output = Debayer_Adaptiveinter(bayer,pattern)[H,W]     = size(bayer);
Output    = zeros(H,W,3);%% 插值G通道
g1        = [-1 1];
g2        = [-1 0 2 0 -1];G1        = conv2(bayer,g1,'same');
G2        = conv2(bayer,g2,'same');
h         = abs(G1)+abs(G2);G1        = conv2(bayer,g1','same');
G2        = conv2(bayer,g2','same');
v         = abs(G1)+abs(G2);Gh        = conv2(bayer,[0 0.5 0 0.5 0], 'same') + conv2(bayer,[-0.25 0 0.5 0 -0.25], 'same');
Gv        = conv2(bayer,[0 0.5 0 0.5 0]', 'same') + conv2(bayer,[-0.25 0 0.5 0 -0.25]', 'same');
h1        = [0 1/4 0; 1/4 0 1/4; 0 1/4 0];
h2        = [0 0 -1 0 0; 0 0 0 0 0; -1 0 4 0 -1; 0 0 0 0 0; 0 0 -1 0 0]/8;
Gmean     = conv2(bayer,h1, 'same') + conv2(bayer,h2, 'same');switch patterncase 'bggr'F(1:2:H, 2:2:W)  = 1;F(2:2:H, 1:2:W)  = 1;case 'rggb'F(1:2:H, 2:2:W)  = 1;F(2:2:H, 1:2:W)  = 1;case 'grbg'F(1:2:H, 1:2:W)  = 1;F(2:2:H, 2:2:W)  = 1;case 'gbrg'F(1:2:H, 1:2:W)  = 1;F(2:2:H, 2:2:W)  = 1;
end
Gp                       = Gh.*(h<v) + Gv.*(h>v) + Gmean.*(h==v);
G                        = bayer.*F+(1-F).*Gp;
% figure;imshow(G,[])%% 插值RB分量
f1           = [0.5 0 0.5];
f2           = [-1 2 -1]/4;
GRBh         = conv2(bayer,f1,"same") + conv2(G,f2,'same');
GRBv         = conv2(bayer,f1',"same") + conv2(G,f2','same');h45          = [0 0 1; 0 0 0; -1 0 0];
h135         = [1 0 0; 0 0 0; 0 0 -1];
Gh45         = [0 0 -1; 0 2 0; -1 0 0];
Gh135        = [-1 0 0; 0 2 0; 0 0 -1];D45          = abs(conv2(bayer,h45,'same'))+abs(conv2(G,Gh45,'same'));
D135         = abs(conv2(bayer,h135,'same'))+abs(conv2(G,Gh135,'same'));RB45         = conv2(bayer,[0 0 0.5; 0 0 0; 0.5 0 0],'same')+conv2(G,[0 0 -0.5; 0 1 0; -0.5 0 0],'same');
RB135        = conv2(bayer,[0.5 0 0; 0 0 0; 0 0 0.5],'same')+conv2(G,[-0.5 0 0; 0 1 0; 0 0 -0.5],'same');
RBmean       = conv2(bayer,[0.25 0 0.25; 0 0 0; 0.25 0 0.25],'same')+conv2(G,[-0.25 0 -0.25; 0 1 0; -0.25 0 -0.25],'same');D            = RB45.*(D45<D135) + RB135.*(D45>D135) + RBmean.*(D45==D135);
switch patterncase 'bggr'R(2:2:H,2:2:W) = bayer(2:2:H,2:2:W);R(1:2:H,2:2:W) = GRBv(1:2:H,2:2:W);R(2:2:H,1:2:W) = GRBh(2:2:H,1:2:W);R(1:2:H,1:2:W) = D(1:2:H,1:2:W);B(1:2:H,1:2:W) = bayer(1:2:H,1:2:W);B(1:2:H,2:2:W) = GRBh(1:2:H,2:2:W);B(2:2:H,1:2:W) = GRBv(2:2:H,1:2:W);B(2:2:H,2:2:W) = D(2:2:H,2:2:W);case 'rggb'R(1:2:H,1:2:W) = bayer(1:2:H,1:2:W);R(1:2:H,2:2:W) = GRBh(1:2:H,2:2:W);R(2:2:H,1:2:W) = GRBv(2:2:H,1:2:W);R(2:2:H,2:2:W) = D(2:2:H,2:2:W);B(2:2:H,2:2:W) = bayer(2:2:H,2:2:W);B(1:2:H,2:2:W) = GRBv(1:2:H,2:2:W);B(2:2:H,1:2:W) = GRBh(2:2:H,1:2:W);B(1:2:H,1:2:W) = D(1:2:H,1:2:W);case 'grbg'R(1:2:H,2:2:W) = bayer(1:2:H,2:2:W);R(1:2:H,1:2:W) = GRBh(1:2:H,1:2:W);R(2:2:H,2:2:W) = GRBv(2:2:H,2:2:W);R(2:2:H,1:2:W) = D(2:2:H,1:2:W);B(2:2:H,1:2:W) = bayer(2:2:H,1:2:W);B(1:2:H,1:2:W) = GRBv(1:2:H,1:2:W);B(2:2:H,2:2:W) = GRBh(2:2:H,2:2:W);B(1:2:H,2:2:W) = D(1:2:H,2:2:W);case 'gbrg'R(2:2:H,1:2:W) = bayer(2:2:H,1:2:W);R(1:2:H,1:2:W) = GRBv(1:2:H,1:2:W);R(2:2:H,2:2:W) = GRBh(2:2:H,2:2:W);R(1:2:H,2:2:W) = D(1:2:H,2:2:W);B(1:2:H,2:2:W) = bayer(1:2:H,2:2:W);B(1:2:H,1:2:W) = GRBh(1:2:H,1:2:W);B(2:2:H,2:2:W) = GRBv(2:2:H,2:2:W);B(2:2:H,1:2:W) = D(2:2:H,1:2:W);            
end
Output = cat(3,R,G,B);
end

边缘自适应插值与基于色差恒定的插值结合

\quad\quad 另外一种插值方式可以考虑先用边缘自适应插值的方式插值G通道,然后用色差恒定插值RB通道,代码略。

这篇关于去马赛克(Demosaic)二的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/330214

相关文章

【第二部分 图像处理】第4章 Opencv图像处理高阶【1马赛克】

1.1马赛克概述 笔者今天要讲的是马赛克,相信很多朋友对这个是有有兴趣的,这个号讨厌的,我想大家都懂的哈!好了,言归正传,我们开始今天的讲解吧。 马赛克的实现原理是把图像上某个像素点一定范围邻域内的所有点用邻域内随机选取的一个像素点的颜色代替,这样可以模糊细节,但是可以保留大体的轮廓。 1.2马赛克检测 1.2.1马赛克检测原理 首先讲解马赛克检测吧,以一幅图片为例,来说明马赛克检测所用

android端基于openCV给图片打马赛克

最近一直在捣腾openCV,看到别人朋友圈总喜欢给图片打一点马赛克,充满神秘感。准备用openCV来实现打码,其实足够模糊就能实现马赛克效果。查看API发现ImgProc模块提供四种模糊方法:高斯模糊、均值模糊、中值模糊、双边滤波。在这里主要比较高斯模糊、均值模糊以及自定义覆盖层的实现效果。 首先,各种初始化:openCV库、模糊线程、人脸检测器。 /*** 初始化openCV*/

基于opencv的相机之马赛克功能实现(九)

简介   本篇是对实现图片处理功能:【马赛克】实现的记录。 实现原理   在点击进入该功能之后,首先便初始化生成一份马赛克图片。当用户在图片上滑动时候,用掩码图片记录当前划过的位置;当用户抬起手指,滑动结束之后。根据掩码图片,来用马赛克图片替换掉原图像中被手指划过的位置。当用户是选择清除马赛克时候,同样的在掩码图片上减去对应被划过的马赛克掩码位置,最后用减去划过部分的掩码图片,将马赛克

Qt图像处理技术十一:得到QImage图像的马赛克图像

效果图 指数5 指数15 指数40 原理 马赛克的原理很简单,就是取一个值,让这个值作为一个方格子的长宽,如40*40px的格子,取这个区域的平均R G B值,然后这个区域的所有像素点都是这个RGB值即可 源码 QImage applyMosaic(const QImage& oldImage, int blockSize) {if (oldImage.isNull() || bl

UnityShader实例12:屏幕特效之马赛克(Mosaic)材质

马赛克(Mosaic)材质 概述 马赛克(Mosaic),估计是大伙平时很常见最讨厌的图片处理手段,嘿嘿,没错我说的就是"打码"。好了,正经点,马赛克指现行广为使用的一种图像(视频)处理手段,此手段将影像特定区域的色阶细节劣化并造成色块打乱的效果,因为这种模糊看上去有一个个的小格子组成,便形象的称这种画面为马赛克。其目的通常是让图像大规模的降低图像()视频分辨率,

opencv人脸打马赛克

import cv2def FaceFind(imgPath: str) -> list:image = cv2.imread(imgPath)gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')# 返回人脸坐

边缘计算【智能+安全检测】系列教程--使用OpenCV+GStreamer实现真正的硬解码,完全消除马赛克

通过现有博客的GST_URL = "rtspsrc location=rtsp://admin:abcd1234@192.168.1.64:554/h264/ch01/main/av_stream latency=150 ! rtph264depay ! avdec_h264 ! videorate ! videoconvert ! appsink sync=false" GStreamer的解

用Python给文章中手机号打马赛克

问题 编写代码为文章中手机号大麦塞克。 方法 导入re模块,使用正则表达式的模式pattern = r"(1[3-9])\d{9}"找到电话号码,并提出电话号码的前两位,后面号码用*代替。 代码清单1Content = “““ 白日依19989881888山尽,黄河入45645546468798978海流。欲穷12345千里目,更上15619292345- -层楼。”””import repat

Unity制作马赛克效果

大家好,我是阿赵。   之前在玩怒之铁拳4里面,看到了马赛克场景转换的效果,觉得很有趣,于是也来做一下。 一、2D版本的马赛克转场效果   先看看视频效果: 马赛克转场   这里我是直接写shader实现的,我这里是把shader直接挂在了面片网格上面。当然如果是需要挂在UGUI的Image上面,也是同理,只需要修改一下shader适应UI的裁剪就行,重点关注一下sha

OpenCV_17马赛克和毛玻璃滤镜效果

一、马赛克效果        马赛克的实现原理是把图像上某个像素点一定范围邻域内的所有点用邻域内随机选取的一个像素点的颜色代替,这样可以模糊细节,但是可以保留大体的轮廓。        以下OpenCV程序实现马赛克效果,通过鼠标左键在图像上划定马赛克的矩形框。 代码: #include <opencv2\core\core.hpp>#include <opencv2\highgui\h