mirror of
https://github.com/lltcggie/waifu2x-caffe.git
synced 2025-06-26 13:42:48 +00:00
アルファチャンネル付き画像を正しく扱えるようになった, refs #1
This commit is contained in:
parent
dd802bfdab
commit
07d24de9ed
@ -71,13 +71,35 @@ bool can_use_cuDNN()
|
|||||||
// 画像を読み込んで値を0.0f~1.0fの範囲に変換
|
// 画像を読み込んで値を0.0f~1.0fの範囲に変換
|
||||||
eWaifu2xError LoadImage(cv::Mat &float_image, const std::string &input_file)
|
eWaifu2xError LoadImage(cv::Mat &float_image, const std::string &input_file)
|
||||||
{
|
{
|
||||||
cv::Mat original_image = cv::imread(input_file, cv::IMREAD_COLOR);
|
cv::Mat original_image = cv::imread(input_file, cv::IMREAD_UNCHANGED);
|
||||||
if (original_image.empty())
|
if (original_image.empty())
|
||||||
return eWaifu2xError_FailedOpenInputFile;
|
return eWaifu2xError_FailedOpenInputFile;
|
||||||
|
|
||||||
original_image.convertTo(float_image, CV_32F, 1.0 / 255.0);
|
cv::Mat convert;
|
||||||
|
original_image.convertTo(convert, CV_32F, 1.0 / 255.0);
|
||||||
original_image.release();
|
original_image.release();
|
||||||
|
|
||||||
|
if (convert.channels() == 1)
|
||||||
|
cv::cvtColor(convert, convert, cv::COLOR_GRAY2BGR);
|
||||||
|
else if (convert.channels() == 4)
|
||||||
|
{
|
||||||
|
// アルファチャンネル付きだったら背景を1(白)として画像合成する
|
||||||
|
|
||||||
|
std::vector<cv::Mat> planes;
|
||||||
|
cv::split(convert, planes);
|
||||||
|
|
||||||
|
cv::Mat w2 = planes[3];
|
||||||
|
cv::Mat w1 = 1.0 - planes[3];
|
||||||
|
|
||||||
|
planes[0] = planes[0].mul(w2) + w1;
|
||||||
|
planes[1] = planes[1].mul(w2) + w1;
|
||||||
|
planes[2] = planes[2].mul(w2) + w1;
|
||||||
|
|
||||||
|
cv::merge(planes, convert);
|
||||||
|
}
|
||||||
|
|
||||||
|
float_image = convert;
|
||||||
|
|
||||||
return eWaifu2xError_OK;
|
return eWaifu2xError_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -546,6 +568,17 @@ eWaifu2xError waifu2x(int argc, char** argv, const std::vector<InputOutputPathPa
|
|||||||
|
|
||||||
std::vector<cv::Mat> color_planes;
|
std::vector<cv::Mat> color_planes;
|
||||||
CreateZoomColorImage(float_image, image_size, color_planes);
|
CreateZoomColorImage(float_image, image_size, color_planes);
|
||||||
|
|
||||||
|
cv::Mat alpha;
|
||||||
|
if (float_image.channels() == 4)
|
||||||
|
{
|
||||||
|
std::vector<cv::Mat> planes;
|
||||||
|
cv::split(float_image, planes);
|
||||||
|
alpha = planes[3];
|
||||||
|
|
||||||
|
cv::resize(alpha, alpha, image_size, 0.0, 0.0, cv::INTER_CUBIC);
|
||||||
|
}
|
||||||
|
|
||||||
float_image.release();
|
float_image.release();
|
||||||
|
|
||||||
color_planes[0] = im;
|
color_planes[0] = im;
|
||||||
@ -559,6 +592,24 @@ eWaifu2xError waifu2x(int argc, char** argv, const std::vector<InputOutputPathPa
|
|||||||
cv::cvtColor(converted_image, process_image, ConvertInverseMode);
|
cv::cvtColor(converted_image, process_image, ConvertInverseMode);
|
||||||
converted_image.release();
|
converted_image.release();
|
||||||
|
|
||||||
|
// アルファチャンネルがあったら、アルファを付加してカラーからアルファの影響を抜く
|
||||||
|
if (!alpha.empty())
|
||||||
|
{
|
||||||
|
std::vector<cv::Mat> planes;
|
||||||
|
cv::split(process_image, planes);
|
||||||
|
process_image.release();
|
||||||
|
|
||||||
|
planes.push_back(alpha);
|
||||||
|
|
||||||
|
cv::Mat w2 = planes[3];
|
||||||
|
|
||||||
|
planes[0] = (planes[0] - 1.0).mul(1.0 / w2) + 1.0;
|
||||||
|
planes[1] = (planes[1] - 1.0).mul(1.0 / w2) + 1.0;
|
||||||
|
planes[2] = (planes[2] - 1.0).mul(1.0 / w2) + 1.0;
|
||||||
|
|
||||||
|
cv::merge(planes, process_image);
|
||||||
|
}
|
||||||
|
|
||||||
const cv::Size_<int> ns(image_size.width * shrinkRatio, image_size.height * shrinkRatio);
|
const cv::Size_<int> ns(image_size.width * shrinkRatio, image_size.height * shrinkRatio);
|
||||||
if (image_size.width != ns.width || image_size.height != ns.height)
|
if (image_size.width != ns.width || image_size.height != ns.height)
|
||||||
cv::resize(process_image, process_image, ns, 0.0, 0.0, cv::INTER_LINEAR);
|
cv::resize(process_image, process_image, ns, 0.0, 0.0, cv::INTER_LINEAR);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user