如果一张图片的背景是黑色,上面的内容是蓝色,那么怎么给蓝色的内容加上白边呢?
方法是用卷积核遍历每个像素点,如果同一个核内既有蓝点也有黑点,那么将卷积核内的黑点变成白点,这样就形成了白边。代码如下:
void add_shader(cv::Mat& img, int core = 2)
{
int w = img.cols, h = img.rows; int row_size = (int)img.step, p_size =(int)img.elemSize();
uchar* d, * row;
d = img.data; row = d; row += row_size * core; d = row + p_size * core;
for (int i = core; i < h - core; i++)
{
for (int j = core; j < w - core; j++)
{
if (d[0] == 255 && d[1] == 0 && d[2] == 0) // blue pixel
{
bool hasBlack = false;
for (int pi = -core; pi <= core; pi++)
{
for (int pj = -core; pj <= core; pj++)
{
auto pd = d + pi * row_size + pj * p_size;
if (pd[0] == 0 && pd[1] == 0 && pd[2] == 0) { hasBlack = true; goto end; }
}
}
end:
if (hasBlack)
{
for (int pi = -core; pi <= core; pi++)
{
for (int pj = -core; pj <= core; pj++)
{
auto pd = d + pi * row_size + pj * p_size;
if (pd[0] == 0 && pd[1] == 0 && pd[2] == 0) { pd[0] = pd[1] = pd[2] = pd[3] = 255; }
}
}
}
}
d += p_size;
}
row += row_size; d = row + p_size * core;
}
}