- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
情况:
假设我有一个图像 A,例如 512x512 像素和图像 B,5x5 或 7x7 像素。两个图像都是 24 位 rgb,B 有 1 位 alpha 掩码(所以每个像素要么完全透明要么完全实心)。
我需要在图像 A 中找到一个像素(及其相邻像素)与图像 B 最相似的像素,或者可能与图像 B 最相似的像素。
相似度计算为“距离”,即非透明 B 的像素与 A 的像素之间的“距离”之和除以非透明 B 的像素数。以下是用于解释的示例 SDL 代码:
struct Pixel{
unsigned char b, g, r, a;
};
void fillPixel(int x, int y, SDL_Surface* dst, SDL_Surface* src, int dstMaskX, int dstMaskY){
Pixel& dstPix = *((Pixel*)((char*)(dst->pixels) + sizeof(Pixel)*x + dst->pitch*y));
int xMin = x + texWidth - searchWidth;
int xMax = xMin + searchWidth*2;
int yMin = y + texHeight - searchHeight;
int yMax = yMin + searchHeight*2;
int numFilled = 0;
for (int curY = yMin; curY < yMax; curY++)
for (int curX = xMin; curX < xMax; curX++){
Pixel& cur = *((Pixel*)((char*)(dst->pixels) + sizeof(Pixel)*(curX & texMaskX) + dst->pitch*(curY & texMaskY)));
if (cur.a != 0)
numFilled++;
}
if (numFilled == 0){
int srcX = rand() % src->w;
int srcY = rand() % src->h;
dstPix = *((Pixel*)((char*)(src->pixels) + sizeof(Pixel)*srcX + src->pitch*srcY));
dstPix.a = 0xFF;
return;
}
int storedSrcX = rand() % src->w;
int storedSrcY = rand() % src->h;
float lastDifference = 3.40282347e+37F;
//unsigned char mask =
for (int srcY = searchHeight; srcY < (src->h - searchHeight); srcY++)
for (int srcX = searchWidth; srcX < (src->w - searchWidth); srcX++){
float curDifference = 0;
int numPixels = 0;
for (int tmpY = -searchHeight; tmpY < searchHeight; tmpY++)
for(int tmpX = -searchWidth; tmpX < searchWidth; tmpX++){
Pixel& tmpSrc = *((Pixel*)((char*)(src->pixels) + sizeof(Pixel)*(srcX+tmpX) + src->pitch*(srcY+tmpY)));
Pixel& tmpDst = *((Pixel*)((char*)(dst->pixels) + sizeof(Pixel)*((x + dst->w + tmpX) & dstMaskX) + dst->pitch*((y + dst->h + tmpY) & dstMaskY)));
if (tmpDst.a){
numPixels++;
int dr = tmpSrc.r - tmpDst.r;
int dg = tmpSrc.g - tmpDst.g;
int db = tmpSrc.g - tmpDst.g;
curDifference += dr*dr + dg*dg + db*db;
}
}
if (numPixels)
curDifference /= (float)numPixels;
if (curDifference < lastDifference){
lastDifference = curDifference;
storedSrcX = srcX;
storedSrcY = srcY;
}
}
dstPix = *((Pixel*)((char*)(src->pixels) + sizeof(Pixel)*storedSrcX + src->pitch*storedSrcY));
dstPix.a = 0xFF;
}
这个东西应该用于纹理生成。
现在,问题是:
最简单的方法是暴力搜索(在示例例程中使用)。但它很慢 - 即使使用 GPU 加速和双核 cpu 也不会使它更快。由于 B 的掩码,我似乎无法使用修改后的二进制搜索。那么,我怎样才能更快地找到所需的像素呢?
附加信息:
想法?
最佳答案
您需要了解运动估计,它在视频编码中用于查找先前编码图片中与要编码的 block 最相似的 block 的位置。
(注意:我没有足够的声誉来发布 2 个链接,因此您必须在维基百科中查找运动估计)。
可以找到一些简单的 block 匹配算法here .这些方法仅通过分析搜索区域中的一部分点来工作。
如果您想找到最小化匹配函数的特定点,则必须进行全搜索。全搜索加速通常通过提前终止来实现——如果已经不可能改进之前的最佳结果,则结束对点的评估。
min_sad = INT_MAX // minimum sum of absolute difference
min_point = {0, 0}
foreach (point p : all_search_points )
{
sad = 0
for( y = 0; y < block_height; ++y )
for( x = 0; x < block_width && sad < min_sad; ++x ):
sad += abs( block_b[y,x] - block_a[p.y+y, p.x+x] )
if( sad < min_sad )
min_sad = sad
min_point = p
}
在仅检查搜索点的子集时,提前终止也很有用,尽管加速比不上完整搜索。
关于c++ - 图片/"most resembling pixel"搜索优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2914971/
我正在编写一个 cordova 应用程序,需要隔离这些谷歌手机以调整样式 鉴于此: 我很难区分任何一款 Google Pixel 手机。 @media only screen and (min-wid
在 Web 布局中为像素和百分比定义距离的用例是什么? 在多个分辨率方面使用像素有什么缺点吗?它们会正确缩放吗? 最佳答案 百分比布局 这通常称为流体布局。您的元素将占用它们可用总空间的定义百分比。这
我正在处理使用 pixel.getGreen() 方法的作业。我的问题是,当我尝试使用 pixel.getGreen (不带括号)时,我得到的结果与使用带括号的方法时得到的结果不同。两者有什么区别?
我正在寻找 Pixel 2 虚拟设备。我已经更新到最新的 Android Studio RC2 版本,但似乎 Pixel 设备是列表中的最后一个。 我知道我可以创建具有 Pixel 2 分辨率的自定义
我需要降低图片的实际分辨率,使 4 像素矩形中的每个像素都是这 4 个像素的平均值。 即 p1 p2 p6 p7 a1 a1 a2 a2 p3 p4 p8 p9 ... -> a1
我正在尝试使用 Electron 在桌面应用程序中创建一个简单的 javascript Canvas 游戏。我正在使用像素艺术,所以为了让我的像素艺术图像在缩放时保持良好的质量,我使用了以下 CSS:
我想对 ee.Image 逐个像素地执行一些计算,但是,计算的结果必须服从概率高斯分布,因此一些像素将被修改,而另一些则不会。我已经编写了一个概率函数,但我不知道如何将它应用于 GEE 中的每个像素。
这是我的代码: int columns 3; int columnWidth = self.layer.bounds.size.width / 3; for (int c = 1; c < colum
1.将image.jpg加载到数组中2.从数组中随机选择坐标并显示该像素及其所有属性3. 从数组中使用弹出坐标。4. 重复#2 直到数组为空 这将显示一个填充了随机像素的图像。 最终结果始终是原始图像
我正在开发一个从 Wi-Fi 摄像头接收 UPD 广播数据包的应用程序。 在我发现在 Google Pixel 2/Pixel 2 XL 接收 UPD 广播数据包的问题之前,它曾经很好。 为了找出原因
我想将新的 Google 手机添加到 Chrome 开发工具中的模拟设备中。 有人知道 Pixel 3 和 Pixel 3 XL 的正确自定义设备设置吗? 最佳答案 您必须输入 视口(viewport
我在我的 React Native 应用程序中使用 0.5px 边框。这在大多数设备上效果很好,但在 iPhone 6 plus 上,这些边框显得模糊。在阅读了像素比率之后here我决定使用类似下面的
我正在开发一个网站,想看看它在 Google Pixel 和 Google Pixel XL 设备上的运行情况。由于我无权访问这些设备,因此我需要知道这些设备的视口(viewport)宽度、高度和设备
我知道我们是在点而不是像素上操作,在大多数情况下这很方便,但我需要使 UIView 的高度为 1 像素而不是 2 像素。因此,如果您在 Interaface 构建器中拖放一些 UIView(分隔线),
摘要和目标: 我正在尝试制作一个着色器来为游戏编辑器执行简单的窗口效果。该效果将绘制一个具有低值边框颜色和高值突出显示的框架。我尝试了很多方法,但总的来说,我只提出了一种可能的解决方案来使用 GPU
我的代码目前包含加载图像,这是成功的,我认为与问题无关。 然后我继续将彩色图像转换为名为 rgb 的 np.array # convert image into array rgb =
我对使用 Visual C++ 进行图像处理相当陌生,我正在寻找一种方法来读取黑白 TIFF 文件并将图像写入表示 0 或 1 的十六进制值数组,然后获取 0 的位置信息(黑色)或 1(白色)。 经过
WebKit 引入了 -webkit-device-pixel-ratio 媒体功能和 window.devicePixelRatio JavaScript 属性,以允许网络作者检测他们的页面是否正在
我正在执行一项任务,将每个像素有 8 位 (uint8_t) 且每个像素只能为 0 或 1(或 255)的大型二进制标签图像转换为数组uint64_t 数字和 uint64_t 数字中的每一位代表一个
需要能够为不同的设备像素比值指定不同的 css。如何做到这一点 例如, 0 @media (-webkit-max-device-pixel-ratio:1.0) { > .
我是一名优秀的程序员,十分优秀!