我想從現有圖像中裁剪出圖像。我已經拍攝的圖像和使用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