作者:Steven
著作權宣告:著作權歸作者所有,商業轉載請聯系作者獲得授權,非商業轉載請注明出處
功能函式
// 羽化
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是羽化強度,該值越大則羽化程度越大,使整張圖被羽化的區域變大~
如果文章幫助到你了,可以點個贊讓我知道,我會很快樂~加油!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/296476.html
標籤:AI
上一篇:微信公眾號機器人詳細教程
下一篇:OpenCV-繪制同心圓
