做网站盘锦,安徽今天刚刚发生的新闻,淮安市网站建设,招聘网络推广专员文章目录 总体步骤1.RGB转HSV2.找出要换的底色3.取反#xff0c;黑白颠倒4.将原图像的非背景部分复制到新背景上 完整代码1.C纯手写版2.官方API版本 总体步骤 1.RGB转HSV
为什么一定要转为HSV 颜色空间#xff1f;
将图像从BGR颜色空间转换为HSV颜色空间是因为HSV颜色空间更… 文章目录 总体步骤1.RGB转HSV2.找出要换的底色3.取反黑白颠倒4.将原图像的非背景部分复制到新背景上 完整代码1.C纯手写版2.官方API版本 总体步骤 1.RGB转HSV
为什么一定要转为HSV 颜色空间
将图像从BGR颜色空间转换为HSV颜色空间是因为HSV颜色空间更适合进行颜色分割和提取操作。这是因为HSV颜色空间将颜色表示为色相Hue、饱和度Saturation和明度Value这使得颜色的分离更加直观和有效。具体原因如下
色相Hue分离
在HSV颜色空间中色相H直接表示颜色的种类例如红色、绿色、蓝色等。通过指定色相范围可以非常容易地分离出特定的颜色。例如**绿色的色相范围通常集中在一个较小的区间内这使得提取绿色对象变得简单而精确。**这也是为什么特效制作的时候需要使用绿色幕布更加方便提取图像。
饱和度Saturation和明度Value独立
饱和度表示颜色的纯度明度表示颜色的亮度。在BGR颜色空间中这些属性是混合在一起的不容易分离。但是在HSV颜色空间中饱和度和明度是独立的可以单独进行调节和阈值化从而实现更好的颜色分割效果。
处理光照变化
HSV颜色空间对于光照变化更为鲁棒。由于明度和饱和度是独立的即使在光照发生变化时色相也相对稳定使得颜色分割在不同光照条件下表现更好。
HSV范围取色表 例如在H35 -77 S43-255 V46-255 之间的可以认为是绿色。 有了这张图参考我们能够更容易地过滤掉某种颜色。
2.找出要换的底色
以将一张蓝底的证件照换成红底证件照为例 转为HSV颜色空间之后我们要找出蓝色的底色所在区域。可以通过遍历像素的方式实现
// 根据范围创建 掩码图像 二值化图像
void customInRange(const Mat src, Scalar lowerBound, Scalar upperBound, Mat dst) {// 创建与源图像大小相同的掩码图像dst Mat::zeros(src.size(), CV_8UC1);// 遍历图像的每个像素for (int y 0; y src.rows; y) {for (int x 0; x src.cols; x) {Vec3b pixel src.atVec3b(y, x);bool inRange true;// 检查像素值是否在指定范围内 通过HSV范围表来指定for (int c 0; c 3; c) {if (pixel[c] lowerBound[c] || pixel[c] upperBound[c]) {inRange false;break;}}// 如果在范围内设置掩码图像中的对应位置为255if (inRange) {dst.atuchar(y, x) 255;}}}
}这里涉及到一个新概念 掩码图像
掩码mask在计算机视觉和图像处理领域中是一种用于选择、过滤或操作图像中特定部分的工具。掩码本质上是一张与原图像大小相同的二值图像其中每个像素要么是0要么是1在OpenCV中通常用0和255来表示。掩码图像中值为1或255的部分表示感兴趣的区域ROIRegion of Interest而值为0的部分则表示不感兴趣的区域。
掩码的具体作用可以包括以下几种
区域选择 通过掩码可以选择图像中的某个特定区域进行操作而忽略其他部分。例如只对图像中的某个颜色范围进行处理。 图像分割 掩码可以用于将图像分割成前景和背景。前景是感兴趣的部分背景则是其他部分。 图像修复 掩码可以用于图像修复指定需要修复的区域。 遮罩操作 在图像合成时掩码可以用作遮罩控制哪些部分需要叠加或混合。
上述代码通过遍历可以找到蓝色底色的区域并置为白色。其余的全部设置为黑色。
代码运行效果中间的白点因为胖虎穿的偏蓝色领带因此过滤出了一部分 此时基本上已经找出原来底色的区域已经全部置成了白色。
3.取反黑白颠倒
主要目的是找到除了背景色的其他元素这一步是选择 非背景色的元素 置为白色因为除了背景色其他像素均要移到新的背景色上去 非背景色成为了ROI感兴趣区域背景色置为黑色代表不再关注原来的背景色。遍历每个像素用255减去原来的像素便可反转颜色黑白颠倒。
// bitwise_not(mask,mask);for (int y 0; y mask.rows; y) {for (int x 0; x mask.cols; x) {//对每个像素进行取反mask.atuchar(y, x) 255 - mask.atuchar(y, x);}}效果如图 4.将原图像的非背景部分复制到新背景上
//将非背景色像素移到事先准备好的背景上
void customCopyTo(const Mat src, Mat dst, const Mat mask) {// 确保源图像和掩码图像的大小一致if (src.size() ! dst.size() || src.size() ! mask.size()) {throw std::invalid_argument(Size of src, dst, and mask must be the same);}// 遍历图像的每个像素for (int y 0; y src.rows; y) {for (int x 0; x src.cols; x) {// 如果掩码中的值为非零通常是255则复制源图像的像素到目标图if (mask.atuchar(y, x) ! 0) {dst.atVec3b(y, x) src.atVec3b(y, x);}}}
}遍历像素与掩码图像对比如果不是黑色说明是ROI区域将像素替换到准备好的纯色背景上面。就完成了背景换色
效果如下 完整代码
1.C纯手写版
//将非背景色像素移到事先准备好的背景上
void customCopyTo(const Mat src, Mat dst, const Mat mask) {// 确保源图像和掩码图像的大小一致if (src.size() ! dst.size() || src.size() ! mask.size()) {throw std::invalid_argument(Size of src, dst, and mask must be the same);}// 遍历图像的每个像素for (int y 0; y src.rows; y) {for (int x 0; x src.cols; x) {// 如果掩码中的值为非零通常是255则复制源图像的像素到目标图像if (mask.atuchar(y, x) ! 0) {dst.atVec3b(y, x) src.atVec3b(y, x);}}}
}
// 根据范围创建 掩码图像 二值化图像
void customInRange(const Mat src, Scalar lowerBound, Scalar upperBound, Mat dst) {// 创建与源图像大小相同的掩码图像dst Mat::zeros(src.size(), CV_8UC1);// 遍历图像的每个像素for (int y 0; y src.rows; y) {for (int x 0; x src.cols; x) {Vec3b pixel src.atVec3b(y, x);bool inRange true;// 检查像素值是否在指定范围内for (int c 0; c 3; c) {if (pixel[c] lowerBound[c] || pixel[c] upperBound[c]) {inRange false;break;}}// 如果在范围内设置掩码图像中的对应位置为255if (inRange) {dst.atuchar(y, x) 255;}}}
}void inRange_dmeo(Mat image){Mat hsv;//先将图片转为HSVcvtColor(image,hsv,COLOR_BGR2HSV);// 提取左上角像素的HSV值 ,也就是对应底色的值 有利于更好控制提取Vec3b hsvValue hsv.atVec3b(0, 0);couthsvValueendl;Mat mask;//设置 下限 和上限根据设定的HSV颜色范围 生成一个二值化的掩码mask掩码中白色部分表示图像中符合设定颜色范围的部分黑色部分表示不符合的部分。customInRange(hsv,Scalar(100,43,46),Scalar(115,225,227),mask);imshow(mask,mask);//准备好一个背景颜色 以红色为例Mat red_background Mat::zeros(image.size(),image.type());red_background Scalar (40,40,200);//对掩码取反 黑白颠倒,选择除了背景色的区域 也就是欲复制的区域
// bitwise_not(mask,mask);for (int y 0; y mask.rows; y) {for (int x 0; x mask.cols; x) {//对每个像素进行取反mask.atuchar(y, x) 255 - mask.atuchar(y, x);}}imshow(bitwise_not mask,mask);//使用掩码mask将输入图像中符合条件的部分复制到红色背景图像上customCopyTo(image,red_background,mask);imshow(roi,red_background);
}
2.官方API版本
OpenCV提供了生成掩码掩码取反复制非背景色元素到新背景的API 如下
inRange 根据HSV范围 生成掩码
bitwise_not 掩码取反
copyTo 根据掩码复制到新背景色
void inRange_dmeo(Mat image){Mat hsv;//先将图片转为HSVcvtColor(image,hsv,COLOR_BGR2HSV);// 提取左上角像素的HSV值 ,也就是对应底色的值 有利于更好控制提取Vec3b hsvValue hsv.atVec3b(0, 0);couthsvValueendl;Mat mask;//设置 下限 和上限根据设定的HSV颜色范围 生成一个二值化的掩码mask掩码中白色部分表示图像中符合设定颜色范围的部分黑色部分表示不符合的部分。inRange(hsv,Scalar(100,43,46),Scalar(115,225,227),mask);imshow(mask,mask);//准备好一个背景颜色 以红色为例Mat red_background Mat::zeros(image.size(),image.type());red_background Scalar (40,40,200);//对掩码取反 黑白颠倒,选择除了背景色的区域 也就是欲复制的区域bitwise_not(mask,mask);imshow(bitwise_not mask,mask);//使用掩码mask将输入图像中符合条件的部分复制到红色背景图像上image.copyTo(red_background,mask);imshow(roi,red_background);
} 文章转载自: http://www.morning.mmsf.cn.gov.cn.mmsf.cn http://www.morning.huarma.com.gov.cn.huarma.com http://www.morning.qqrlz.cn.gov.cn.qqrlz.cn http://www.morning.zyrcf.cn.gov.cn.zyrcf.cn http://www.morning.xqspn.cn.gov.cn.xqspn.cn http://www.morning.c7629.cn.gov.cn.c7629.cn http://www.morning.rnkq.cn.gov.cn.rnkq.cn http://www.morning.ssglh.cn.gov.cn.ssglh.cn http://www.morning.zqzhd.cn.gov.cn.zqzhd.cn http://www.morning.kqylg.cn.gov.cn.kqylg.cn http://www.morning.trsdm.cn.gov.cn.trsdm.cn http://www.morning.qctsd.cn.gov.cn.qctsd.cn http://www.morning.qbwyd.cn.gov.cn.qbwyd.cn http://www.morning.bpmdq.cn.gov.cn.bpmdq.cn http://www.morning.sjftk.cn.gov.cn.sjftk.cn http://www.morning.rwdbz.cn.gov.cn.rwdbz.cn http://www.morning.wkwds.cn.gov.cn.wkwds.cn http://www.morning.mkrjf.cn.gov.cn.mkrjf.cn http://www.morning.qxycf.cn.gov.cn.qxycf.cn http://www.morning.hmjasw.com.gov.cn.hmjasw.com http://www.morning.rhdqz.cn.gov.cn.rhdqz.cn http://www.morning.txzqf.cn.gov.cn.txzqf.cn http://www.morning.gwdkg.cn.gov.cn.gwdkg.cn http://www.morning.sbrjj.cn.gov.cn.sbrjj.cn http://www.morning.npgwb.cn.gov.cn.npgwb.cn http://www.morning.zcmpk.cn.gov.cn.zcmpk.cn http://www.morning.ltdrz.cn.gov.cn.ltdrz.cn http://www.morning.wnbqy.cn.gov.cn.wnbqy.cn http://www.morning.zrdqz.cn.gov.cn.zrdqz.cn http://www.morning.wbllx.cn.gov.cn.wbllx.cn http://www.morning.bxbkq.cn.gov.cn.bxbkq.cn http://www.morning.wrdpj.cn.gov.cn.wrdpj.cn http://www.morning.jpgfq.cn.gov.cn.jpgfq.cn http://www.morning.znrgq.cn.gov.cn.znrgq.cn http://www.morning.qlsyf.cn.gov.cn.qlsyf.cn http://www.morning.kyzxh.cn.gov.cn.kyzxh.cn http://www.morning.zmpqt.cn.gov.cn.zmpqt.cn http://www.morning.lywpd.cn.gov.cn.lywpd.cn http://www.morning.rflcy.cn.gov.cn.rflcy.cn http://www.morning.sjwzz.cn.gov.cn.sjwzz.cn http://www.morning.wnqfz.cn.gov.cn.wnqfz.cn http://www.morning.zxxys.cn.gov.cn.zxxys.cn http://www.morning.oioini.com.gov.cn.oioini.com http://www.morning.mdxwz.cn.gov.cn.mdxwz.cn http://www.morning.qgbfx.cn.gov.cn.qgbfx.cn http://www.morning.kpbgvaf.cn.gov.cn.kpbgvaf.cn http://www.morning.ydryk.cn.gov.cn.ydryk.cn http://www.morning.tynqy.cn.gov.cn.tynqy.cn http://www.morning.lgnz.cn.gov.cn.lgnz.cn http://www.morning.bszmy.cn.gov.cn.bszmy.cn http://www.morning.zzbwjy.cn.gov.cn.zzbwjy.cn http://www.morning.qlpyn.cn.gov.cn.qlpyn.cn http://www.morning.rjrnx.cn.gov.cn.rjrnx.cn http://www.morning.dhrbj.cn.gov.cn.dhrbj.cn http://www.morning.kdbbm.cn.gov.cn.kdbbm.cn http://www.morning.ngznq.cn.gov.cn.ngznq.cn http://www.morning.qwpdl.cn.gov.cn.qwpdl.cn http://www.morning.lgnrl.cn.gov.cn.lgnrl.cn http://www.morning.rlrxh.cn.gov.cn.rlrxh.cn http://www.morning.gcqdp.cn.gov.cn.gcqdp.cn http://www.morning.tnwgc.cn.gov.cn.tnwgc.cn http://www.morning.wnxqf.cn.gov.cn.wnxqf.cn http://www.morning.vjwkb.cn.gov.cn.vjwkb.cn http://www.morning.qrwdg.cn.gov.cn.qrwdg.cn http://www.morning.dgknl.cn.gov.cn.dgknl.cn http://www.morning.tlfmr.cn.gov.cn.tlfmr.cn http://www.morning.ltdrz.cn.gov.cn.ltdrz.cn http://www.morning.mgnrc.cn.gov.cn.mgnrc.cn http://www.morning.tqdlk.cn.gov.cn.tqdlk.cn http://www.morning.kaweilu.com.gov.cn.kaweilu.com http://www.morning.xrrbj.cn.gov.cn.xrrbj.cn http://www.morning.rwmp.cn.gov.cn.rwmp.cn http://www.morning.xyhql.cn.gov.cn.xyhql.cn http://www.morning.ktsth.cn.gov.cn.ktsth.cn http://www.morning.xrhst.cn.gov.cn.xrhst.cn http://www.morning.mnkz.cn.gov.cn.mnkz.cn http://www.morning.gwqcr.cn.gov.cn.gwqcr.cn http://www.morning.fengnue.com.gov.cn.fengnue.com http://www.morning.yrsg.cn.gov.cn.yrsg.cn http://www.morning.ey3h2d.cn.gov.cn.ey3h2d.cn