在做灰度图像数字识别的时候,遇到了个问题,搞了半天才弄出来,记录一下过程,想法很简单,就是遍历图像像素点。
如图所示,黑色矩形框边界模糊,在做数字切割的时候,按照黑白像素点区分切割,由于图像存在白-黑-白的问题,需要将最外围的白的全置换成红色。
void my_getpixel(Mat &img)
{
if (img.empty())
{
cout << "img is null" << endl;
}
//设置像素,从左往右
for (int r = 0; r < img.rows; ++r)
{
for (int c = 0; c < img.cols; ++c)
{
if (img.ptr<uchar>(r)[c] > 200 && img.ptr<uchar>(r)[c+1] >200 )
{
img.ptr<uchar>(r)[c] = 1;
}
if (img.ptr<uchar>(r)[c] > 200 && img.ptr<uchar>(r)[c+1] < 100)
{
img.ptr<uchar>(r)[c] = 1;
break;
}
}
}
//旋转180度
Mat src1 = img.clone();
Mat dst;
flip(src1, dst, -1);
for (int r = 0; r < dst.rows; ++r)
{
for (int c = 0; c < dst.cols; ++c)
{
if (dst.ptr<uchar>(r)[c] > 200 && dst.ptr<uchar>(r)[c + 1] >200)
{
dst.ptr<uchar>(r)[c] = 1;
}
if (dst.ptr<uchar>(r)[c] > 200 && dst.ptr<uchar>(r)[c + 1] < 100)
{
dst.ptr<uchar>(r)[c] = 1;
break;
}
}
}
flip(dst, dst, -1);
imshow("transpose180", dst);
//遍历查看像素点
for (int r2 = 0; r2 < img.rows; ++r2)
{
for (int c2 = 0; c2 < img.cols; ++c2)
{
printf("第(%d,%d)点的灰度值是%d \n", r2, c2, img.ptr<uchar>(r2)[c2]);
}
}
imshow("my_getpiex",img);
waitKey(0);
}
使用了两个f循环,因为第一次循环左边变成了黑色,右边却没有改变。但是从后遍历图像捯饬半天也没弄好,就通过图像旋转的方式将图像旋转180°,最后在旋转回来。就得到了最后结果。这样就可以去做数字切割了。