- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想在这个paper中实现颜色迁移算法我引用这个tutorial在 OpenCV C++ 中传输算法。
但是我得到了一些奇怪的结果,例如: This是源图像,this是目标,但组合结果看起来像 this .结果的某些部分看起来很奇怪。
这是我的源代码
Mat src; Mat tar; Mat result;
class imageInfo{
public:
double lMean, lStd, aMean, aStd, bMean, bStd;
};
/// Function header
void image_stats(Mat img,imageInfo *info);
/** @function main */
int main(int argc, char** argv)
{
vector<Mat> mv;
imageInfo srcInfo, tarInfo;
src = imread("images/autumn.jpg");
tar = imread("images/fallingwater.jpg");
imshow("src", src);
imshow("tar", tar);
cvtColor(src, src, CV_BGR2Lab);
cvtColor(tar, tar, CV_BGR2Lab);
image_stats(src, &srcInfo);
image_stats(tar, &tarInfo);
split(tar, mv);
Mat l = mv[0];
Mat a = mv[1];
Mat b = mv[2];
/*pixel color modify*/
for (int i = 0; i<l.rows; i++){
for (int j = 0; j<l.cols; j++){
double li = l.data[l.step[0] * i + l.step[1] * j];
if (i == 426 && j == 467)
cout << "i:" << i << "j:" << j << " " << li << endl;
li -= tarInfo.lMean;
li = (tarInfo.lStd / srcInfo.lStd)*li;
li += srcInfo.lMean;
li = (int)li % 256;
l.data[l.step[0] * i + l.step[1] * j] = li;
}
}
for (int i = 0; i<a.rows; i++){
for (int j = 0; j<a.cols; j++){
double ai = a.data[a.step[0] * i + a.step[1] * j];
ai -= tarInfo.aMean;
ai = (tarInfo.aStd / srcInfo.aStd)*ai;
ai += srcInfo.aMean;
ai = (int)ai % 256;
a.data[a.step[0] * i + a.step[1] * j] = ai;
}
}
for (int i = 0; i<b.rows; i++){
for (int j = 0; j<b.cols; j++){
double bi = b.data[b.step[0] * i + b.step[1] * j];
bi -= tarInfo.bMean;
bi = (tarInfo.bStd / srcInfo.bStd)*bi;
bi += srcInfo.bMean;
bi = (int)bi % 256;
b.data[b.step[0] * i + b.step[1] * j] = bi;
}
}
mv.clear();
mv.push_back(l);
mv.push_back(a);
mv.push_back(b);
merge(mv, result);
cvtColor(result, result, CV_Lab2BGR);
imshow("result", result);
imwrite("result.png", result);
waitKey(0);
return(0);
}
image_stats 函数:
void image_stats(Mat img, imageInfo *info){
int Max=0;
vector<Mat> mv;
vector<int> vl, va, vb;
split(img, mv);
Mat l = mv[0];
Mat a = mv[1];
Mat b = mv[2];
/*statistics L space*/
for (int i = 0; i<l.rows; i++){
for (int j = 0; j<l.cols; j++){
int li = l.data[l.step[0] * i + l.step[1] * j];
vl.push_back(li);
}
}
double sum_l = std::accumulate(vl.begin(), vl.end(), 0.0);
double mean_l = sum_l / vl.size();
std::vector<double> diff_l(vl.size());
std::transform(vl.begin(), vl.end(), diff_l.begin(),
std::bind2nd(std::minus<double>(), mean_l));
double sq_sum_l = std::inner_product(diff_l.begin(), diff_l.end(), diff_l.begin(), 0.0);
double stdev_l = std::sqrt(sq_sum_l / vl.size());
info->lMean = mean_l;
info->lStd = stdev_l;
/*statistics A space*/
for (int i = 0; i<a.rows; i++){
for (int j = 0; j<a.cols; j++){
int ai = a.data[a.step[0] * i + a.step[1] * j];
va.push_back(ai);
}
}
double sum_a = std::accumulate(va.begin(), va.end(), 0.0);
double mean_a = sum_a / va.size();
std::vector<double> diff_a(va.size());
std::transform(va.begin(), va.end(), diff_a.begin(),
std::bind2nd(std::minus<double>(), mean_a));
double sq_sum_a = std::inner_product(diff_a.begin(), diff_a.end(), diff_a.begin(), 0.0);
double stdev_a = std::sqrt(sq_sum_a / va.size());
info->aMean = mean_a;
info->aStd = stdev_a;
/*statistics B space*/
for (int i = 0; i<b.rows; i++){
for (int j = 0; j<b.cols; j++){
int bi = b.data[b.step[0] * i + b.step[1] * j];
vb.push_back(bi);
}
}
double sum_b = std::accumulate(vb.begin(), vb.end(), 0.0);
double mean_b = sum_b / vb.size();
std::vector<double> diff_b(vb.size());
std::transform(vb.begin(), vb.end(), diff_b.begin(),
std::bind2nd(std::minus<double>(), mean_b));
double sq_sum_b = std::inner_product(diff_b.begin(), diff_b.end(), diff_b.begin(), 0.0);
double stdev_b = std::sqrt(sq_sum_b / vb.size());
info->bMean = mean_b;
info->bStd = stdev_b;
}
最佳答案
在您的主要功能中,您应该将结果值限制在上限和下限范围内 [0; 255],不取模。如果 li = 256;
则代码 li = (int)li % 256;
将使其变为零。
关于c++ - 颜色转移 : What's wrong with my code in OpenCV C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30570628/
如果我将我的个人 repo 转移到一个组织(由我创建),我将失去所有 见解 例如来自原始 Repo 的流量历史记录、拉取请求、贡献者、 fork 等? 最佳答案 拉取请求被保留:参见“About re
如何为解析 if-then[-else] 案例制定正确的规则?这是一些语法: { module TestGram (tparse) where } %tokentype { String }
如何为解析 if-then[-else] 案例制定正确的规则?这是一些语法: { module TestGram (tparse) where } %tokentype { String }
我读过有关mutex的信息,这些信息由线程拥有,并且只能由拥有的线程使用。在this answer中,该解决方案建议每个进程在发出互斥信号之前,必须拥有互斥锁的所有权。我必须在这里承认自己的愚蠢,不知
我只能从回调函数之一中想到 curl_close() 。 但是 php 抛出了一个警告: PHP 警告:curl_close():尝试从回调中关闭 cURL 句柄。 任何想法如何做到这一点? 最佳答案
带有冲突的语法的精简版本: body: variable_list function_list; variable_list: variable_list variable | /* empty
我创建了新的开发者帐户,然后将应用程序转移到新帐户。然后我在新帐户下创建了相同的标识符。并构建App并上传到AppStore。 I have got the warning with WARNING
我想像这样管理类主任的所有 Activity : 此外所有 Activity 都扩展基本 Activity 以使用公共(public) View 。 在这种情况下,我想处理传输 Activity ,例
使用 C 中的简单链表实现,我如何告诉 Splint 我正在转让 data 的所有权? typedef struct { void* data; /*@null@*/ void* ne
请参阅以下 yacc 代码。如果我删除生产因素:'!' expr,解析冲突消失。这里发生了什么? %{ #include #include %} %token TRUE %token FALSE
是否可以将 props 向下传输到子组件,其中 { ..this.props } 用于更简洁的语法,但是排除某些 props,如 className 或 id? 最佳答案 您可以使用解构来完成这项工作
如果我有以下数据框: date A B M S 20150101 8 7 7.5 0 20150101 10 9 9
我需要将一个 __m128i 变量(比如 v)移动 m 位,以便位移动所有变量(因此,结果变量表示 v*2^m)。执行此操作的最佳方法是什么?! 请注意 _mm_slli_epi64 分别移动 v0
我需要这样调用我的程序: ./program hello -r foo bar 我从 argv[1] 中打招呼,但我在使用值 bar 时遇到问题,我是否也应该将“r:”更改为其他内容? while((
我是新来的 Bison我在转换/减少冲突方面遇到了麻烦...我正在尝试从文件加载到 array data[] : struct _data { char name[50]; char sur
当然有很多关于解决移位/归约错误的文档和方法。 Bison 文档建议正确的解决方案通常是%期待它们并处理它。 当你遇到这样的事情时: S: S 'b' S | 't' 您可以像这样轻松解决它们: S:
我有以下(大量精简的)快乐语法 %token '{' { Langle } '}' { Rangle } '..' { DotDot } '::' { ColonC
我的 Bison 解析器中有很多错误,即使它运行良好,我也想了解这些冲突。代码如下: 词法分析器: id ([[:alpha:]]|_)([[:alnum:]]|_)* %% {id
在我的项目中,我有这样的情况,一个 Activity 应该将值(value)转移到另一个 Activity 。并且根据这个值应该选择需要的菜单元素。我试图在 bundle 的帮助下做到这一点,但我不知
我一直在阅读 NSIndexPaths 以获得 uitableviews 等。但是我很难操纵现有的索引路径。 我想在保留行的同时采用现有的索引路径递增/移动每个部分。因此 indexPath.sect
我是一名优秀的程序员,十分优秀!