我有一个问题,大问题=。 我有两个图像(使用GDIplus),我想比较像素像素。 当pixelA = pixelB时,变量 cont 应该递增。
今天,我比较两个相同的图像,我的回报应该是100%,但这个回报是70%。
为什么呢?我怎么解决这个问题?
见
#pragma omp parallel for schedule(dynamic)
for (int x = 0; x < height; x++){
for (int y = 0; y < width; y++){
int luma01 = 0, luma02 = 0;
Gdiplus::Color pixelColorImage01;
Gdiplus::Color pixelColorImage02;
myImage01->GetPixel(x, y, &pixelColorImage01);
luma01 = pixelColorImage01.GetRed() + pixelColorImage01.GetGreen() + pixelColorImage01.GetBlue();
myImage02->GetPixel(x, y, &pixelColorImage02);
luma02 = pixelColorImage02.GetRed() + pixelColorImage02.GetGreen() + pixelColorImage02.GetBlue();
#pragma omp critical
if (luma01 == luma02){
cont++;
}
}
}
图像之间的相等百分比
thanks =)
答案 0 :(得分:2)
在并行化解决方案之前,请确保您可以按顺序解决它。在这种情况下,这意味着注释掉#pragma
并首先进行调试。
首先,
for (int x = 0; x < height; x++){
for (int y = 0; y < width; y++){
...
myImage01->GetPixel(x, y, &pixelColorImage01);
您转置了width
和height
,因此对于任何不正方形的图像,您都会得到错误的答案。
其次,您的像素相等度量标准会受到冲突。由于您将各个颜色的亮度相加然后比较该总和,它会认为,例如,全红色像素等于全蓝色像素。
做这样的事情:
if (red1 == red2 && green1 == green2 && blue1 == blue2)
cont++;
至于你的并行化,它在技术上是正确的,但会给你糟糕的性能。你在if
周围放置一个关键部分,这意味着所有工人都在不断尝试获取该锁。换句话说,你有并行工作者,但每个人都必须等待所有其他人。换句话说,您已经序列化了并行代码。要解决此问题,请查找OpenMP reducer。
答案 1 :(得分:0)
我很高兴你的答案! 亚当,我改变了matriz的位置。现在,我比较个人的颜色! 现在,我有两个小问题。 当我运行代码时:
查看我的代码的结果:http://postimg.org/image/8c1ophkz9/
使用#pragma omp parallel进行计划(动态,1024)缩减(+:cont) 平行时间(0.763秒)(相似度的100%) 连续时间(0.702秒)(相似度的100%)
使用#pragma omp parallel进行计划(动态)缩减(+:cont) 平行时间(0.113秒)(相似度的66%) 连续时间(0.703秒)(相似度的100%)
Image1与image2相同。 我的代码中还有很多colision = \ 我需要缩短并行代码的时间。我不明白为什么并行代码比顺序代码更慢= \
并行代码
#pragma omp parallel for schedule(dynamic) reduction(+:cont)
for (int x = 0; x < width; x++){
for (int y = 0; y < height; y++){
Gdiplus::Color pixelColorImage01;
Gdiplus::Color pixelColorImage02;
myImage01->GetPixel(x, y, &pixelColorImage01);
myImage02->GetPixel(x, y, &pixelColorImage02);
cont += (pixelColorImage01.GetRed() == pixelColorImage02.GetRed() && pixelColorImage01.GetGreen() == pixelColorImage02.GetGreen() && pixelColorImage01.GetBlue() == pixelColorImage02.GetBlue());
}
}
顺序代码
for (int x = 0; x < width; x++){
for (int y = 0; y < height; y++){
Gdiplus::Color pixelColorImage01;
Gdiplus::Color pixelColorImage02;
myImage01->GetPixel(x, y, &pixelColorImage01);
myImage02->GetPixel(x, y, &pixelColorImage02);
cont += (pixelColorImage01.GetRed() == pixelColorImage02.GetRed() && pixelColorImage01.GetGreen() == pixelColorImage02.GetGreen() && pixelColorImage01.GetBlue() == pixelColorImage02.GetBlue());
}
}