OpenCV-PS羽化操作

简介: OpenCV-PS羽化操作

功能函数

// 羽化
cv::Mat Eclosion(cv::Mat src, cv::Point center,float level)
{
  if (level>0.9)
    level = 0.9f;
  float diff = (1-level) * (src.rows / 2 * src.rows / 2 + src.cols / 2 * src.cols / 2);
  cv::Mat result = src.clone();
  for (int i = 0; i < result.rows; ++i)
  {
    for (int j = 0; j < result.cols; ++j)
    {
      float dx = float(center.x - j);
      float dy = float(center.y - i);
      float ra = dx * dx + dy * dy;
      float m = ((ra-diff) / diff * 255)>0? ((ra - diff) / diff * 255):0;
      int b = result.at<Vec3b>(i, j)[0];
      int g = result.at<Vec3b>(i, j)[1];
      int r = result.at<Vec3b>(i, j)[2];
      b = (int)(b+ m);
      g = (int)(g + m);
      r = (int)(r + m);
      result.at<Vec3b>(i, j)[0] = (b > 255 ? 255 : (b < 0 ? 0 : b));
      result.at<Vec3b>(i, j)[1] = (g > 255 ? 255 : (g < 0 ? 0 : g));
      result.at<Vec3b>(i, j)[2] = (r > 255 ? 255 : (r < 0 ? 0 : r));
    }
  }
  return result;
}

测试代码

#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
cv::Mat Eclosion(cv::Mat src, cv::Point center, float level);
int main()
{
  cv::Mat src = imread("test.jpg");
  /***********       羽化   ***********************/
  cv::Mat eclosion1 = Eclosion(src, cv::Point(src.cols / 2, src.rows / 2), 0.5f);
  cv::Mat eclosion2 = Eclosion(src, cv::Point(src.cols / 2, src.rows / 2), 0.3f);
  imshow("原图", src);
    imshow("羽化1", eclosion1);
  imshow("羽化2", eclosion2);
  waitKey(0);
  return 0;
}
// 羽化
cv::Mat Eclosion(cv::Mat src, cv::Point center,float level)
{
  if (level>0.9)
    level = 0.9f;
  float diff = (1-level) * (src.rows / 2 * src.rows / 2 + src.cols / 2 * src.cols / 2);
  cv::Mat result = src.clone();
  for (int i = 0; i < result.rows; ++i)
  {
    for (int j = 0; j < result.cols; ++j)
    {
      float dx = float(center.x - j);
      float dy = float(center.y - i);
      float ra = dx * dx + dy * dy;
      float m = ((ra-diff) / diff * 255)>0? ((ra - diff) / diff * 255):0;
      int b = result.at<Vec3b>(i, j)[0];
      int g = result.at<Vec3b>(i, j)[1];
      int r = result.at<Vec3b>(i, j)[2];
      b = (int)(b+ m);
      g = (int)(g + m);
      r = (int)(r + m);
      result.at<Vec3b>(i, j)[0] = (b > 255 ? 255 : (b < 0 ? 0 : b));
      result.at<Vec3b>(i, j)[1] = (g > 255 ? 255 : (g < 0 ? 0 : g));
      result.at<Vec3b>(i, j)[2] = (r > 255 ? 255 : (r < 0 ? 0 : r));
    }
  }
  return result;
}

测试效果

      本文提供的PS羽化操作函数,可以实现类似PS中羽化的效果,即目标区域中心区不变,边缘区模糊化,center参数是羽化中心,level是羽化强度,该值越大则羽化程度越大,使整张图被羽化的区域变大~

相关文章
|
1月前
|
人工智能
如何使用ps抠图
选中魔棒工具/魔术橡皮擦,点击背景,出现选区,点击Delete键删除。 点击快速选择工具,沿着所需图形的边缘点击。该工具会自动识别图形的边缘并形成选区。
65 1
PS移动与变换、PS图层进阶
本文将简述 PS 中的移动工具的使用、对于对象的自由变换大小方向的操作方法、对于画布的更进阶的认识以及对于图层的正确认识。让我们开始吧!
168 0
|
Windows
PS不能拖入图片进去
PS不能拖入图片进去
|
存储 文件存储 Android开发
PS基本操作介绍与下载
PS基本操作介绍与下载
148 0
PS基本操作介绍与下载
|
计算机视觉 Python
不用 PS 抠图,Python + OpenCV 实现自动海报场景替换!
现存在一个问题,就下面图片中的两本书而言,怎样快速让中间边的书本与左边书本对齐(最终效果能实现两张图片重叠(最终结果为右图)),进行的图像转变可旋转、平移、缩放、形变。
不用 PS 抠图,Python + OpenCV 实现自动海报场景替换!
|
监控
ps命令使用详解
ps命令使用详解
360 0
ps命令使用详解
|
算法 计算机视觉
提示符被覆盖的问题,PS1-PS4_学习笔记
时间:2017.12.31作者:李强参考:man,info,magedu讲义,万能的internet实验环境:VMware® Workstation 12 Pro ,Centos 6.9,Centos 7.4,SecureCRT Version 8.1.4声明:以下英文纯属个人翻译,英文B级,欢迎纠正,以下内容纯属个人理解,并没有对错,只是参考,盗版不纠,才能有限,希望不误人子弟为好。
1020 0