我想从现有图像中裁剪出图像。我已经拍摄的图像和使用ImageMagick上施加单色与阈98%
从现有图像中裁剪图像
所得图像是这样的(是这是可行的在OpenCV中):
立即从该图像我想裁剪出另一个图像,使最终的图像看起来是这样的:
问题 我该如何在OpenCV中做到这一点?请注意,我想裁剪图像的唯一原因是我可以使用this answer来获取文字的一部分。如果不需要剪出一张新图像,而是专注于图像的黑色部分,那就太棒了。
我想从现有图像中裁剪出图像。我已经拍摄的图像和使用ImageMagick上施加单色与阈98%
从现有图像中裁剪图像
所得图像是这样的(是这是可行的在OpenCV中):
立即从该图像我想裁剪出另一个图像,使最终的图像看起来是这样的:
问题 我该如何在OpenCV中做到这一点?请注意,我想裁剪图像的唯一原因是我可以使用this answer来获取文字的一部分。如果不需要剪出一张新图像,而是专注于图像的黑色部分,那就太棒了。
如果在顶部和底部的文字是要crop out,,如果他们总是在同一位置区域的解决方案很简单:刚刚成立,无视这些领域一个ROI:
#include <cv.h>
#include <highgui.h>
int main(int argc, char* argv[])
{
cv::Mat img = cv::imread(argv[1]);
if (img.empty())
{
std::cout << "!!! imread() failed to open target image" << std::endl;
return -1;
}
/* Set Region of Interest */
int offset_x = 129;
int offset_y = 129;
cv::Rect roi;
roi.x = offset_x;
roi.y = offset_y;
roi.width = img.size().width - (offset_x*2);
roi.height = img.size().height - (offset_y*2);
/* Crop the original image to the defined ROI */
cv::Mat crop = img(roi);
cv::imshow("crop", crop);
cv::waitKey(0);
cv::imwrite("noises_cropped.png", crop);
return 0;
}
输出图像:
如果黑色矩形的位置,这是你的区域的利息,不存在一个固定的位置,那么你可能想看看另一种方法:使用rectangle detection technique:
在上面的输出,你有兴趣将第二largest rectangle在该地区图片。所以你只剩下白盒&文本
在一个侧面说明,如果你打算到文本后隔离,一个简单的cv::erode()可以去除图像中的所有声音。去除噪声另一种方法是使用cv::medianBlur()
。你也可以探索cv::morphologyEx()
做的伎俩:
cv::Mat kernel = cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(7, 7), cv::Point(3, 3));
cv::morphologyEx(src, src, cv::MORPH_ELLIPSE, kernel);
一个妥善的解决方案甚至可能是这3个的组合,我证明了那一点上Extract hand bones from X-ray image 。
一个简单的解决方案:从上到下,从下到上,左右和左右扫描线。当线条中暗像素的数量超过线条总像素的50%时终止。这将为您提供xmin,xmax,ymin,ymax坐标来限制您的裁剪矩形。
看来你正在尝试调整图像而不是裁剪它,这是正确的吗? –
@perfanoff birdy想要裁剪它。堆栈溢出正在调整图像大小。 [前](http://i.stack.imgur.com/MKcXt.png)。 [后](http://i.stack.imgur.com/hMTnv.png)。 –
@perfanoff是正确的。谢谢澄清。我没有试图调整图像大小。 – birdy