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是羽化强度,该值越大则羽化程度越大,使整张图被羽化的区域变大~

相关文章
|
Java Maven
idea facets没有web 处理
idea facets没有web 处理
2142 0
idea facets没有web 处理
|
Unix 数据安全/隐私保护 Python
python自动生成Excel表格数据并发送邮件案例
python自动生成Excel表格数据并发送邮件案例
1079 0
|
计算机视觉
YOLOv11改进策略【损失函数篇】| 利用MPDIoU,加强边界框回归的准确性
YOLOv11改进策略【损失函数篇】| 利用MPDIoU,加强边界框回归的准确性
1035 0
YOLOv11改进策略【损失函数篇】| 利用MPDIoU,加强边界框回归的准确性
|
网络安全 Python
Python网络编程小示例:生成CIDR表示的IP地址范围
本文介绍了如何使用Python生成CIDR表示的IP地址范围,通过解析CIDR字符串,将其转换为二进制形式,应用子网掩码,最终生成该CIDR块内所有可用的IP地址列表。示例代码利用了Python的`ipaddress`模块,展示了从指定CIDR表达式中提取所有IP地址的过程。
860 6
|
编解码 关系型数据库 计算机视觉
Opencv学习笔记(十一):opencv通过mp4保存为H.264视频
本文介绍了如何在OpenCV中通过使用cisco开源的openh264库来解决不支持H.264编码的问题,并提供了完整的代码示例。
1722 0
Opencv学习笔记(十一):opencv通过mp4保存为H.264视频
|
存储 物联网 数据安全/隐私保护
如何让AppleWatch自动锁定Mac?
我们都知道AppleWatch支持了解锁Mac的功能,如果您的 Mac(2013 年中或后续机型)安装了macOS Sierra(Apple Watch Series 1 和 Apple Watch Series 2)、macOS High Sierra 或更高版本(Apple Watch Series 3 或后续机型),那么当其从睡眠模式唤醒时,Apple Watch 会立即解锁您的 Mac。
2362 1
如何让AppleWatch自动锁定Mac?
|
算法 机器人 中间件
C++的主要优势是什么?
C++的主要优势是什么?
891 1
|
定位技术 计算机视觉 C++
C++计算机视觉库OpenCV在Visual Studio 2022的配置方法
C++计算机视觉库OpenCV在Visual Studio 2022的配置方法
1168 1