OpenCV 处理 - 边缘检测和裁剪
Posted
技术标签:
【中文标题】OpenCV 处理 - 边缘检测和裁剪【英文标题】:OpenCV Processing - Edge detection and Cropping 【发布时间】:2019-11-25 09:46:30 【问题描述】:如何从预处理图像中去除不规则的白色像素。
我尝试过腐蚀,这会使所有像素变黑。
预处理后:
要求:
我的代码:
Mat img, edges, erode, blurred, element;
element = getStructuringElement(cv::MORPH_RECT, cv::Size(7, 7), cv::Point(-1,-1) );
img = imread("img1925.jpeg"); // read the image
cv::Canny(img, edges, 30, 255, 3); // detect the edges with threshold limit
// cv::erode(edges, erode, element);
GaussianBlur(edges, blurred, cv::Size(7, 7), 0); // blurring
// Rect ROI = boundingRect(blurred); // draw rect for ROI
// Mat src = thresh(ROI);
namedWindow("image", WINDOW_NORMAL);
imshow("image", blurred);
waitKey(0);
return 0;
寻找建议!
【问题讨论】:
您可以轻松地使用使像素成为您想要的任何值的功能。如果你有一定的 RGB 间隔值,你可以改变你想要的任何像素: openCvImage.at<:vec3b>(i,j)[0]=0; (i和j是坐标,[0]代表第一层,0是你分配的值。相关主题:***.com/questions/23001512/…> 不幸的是,我有很多图像,我不确定不规则像素在哪里!所以这个选项不起作用。 你所说的“不规则像素”是什么意思 预处理步骤后,您可以检查不规则像素的密度,以正确定位您的 roi。 这听起来像是一个解决方案。我会调查一下。如果您也能提供一些启发,我将不胜感激! 【参考方案1】:我不确定您从预处理图像中删除不规则白色像素是什么意思,但如果您的目标是提取对象的 ROI,那么这里有一种方法:
将图像转换为灰度,将高斯模糊转换为平滑图像 获取二值图像的自适应阈值 使用轮廓区域查找轮廓和过滤 提取图像中最大的轮廓并裁剪 ROI这是结果
如果您在阈值图像上裁剪了 ROI,结果如下
我在 Python 中实现了它,但您可以在 C++ 中遵循相同的步骤
import cv2
image = cv2.imread('1.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (7,7), 0)
thresh = cv2.adaptiveThreshold(blur,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV,11,3)
cnts = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
cnts = sorted(cnts, key=cv2.contourArea, reverse=True)
for c in cnts:
x,y,w,h = cv2.boundingRect(c)
ROI = image[y:y+h, x:x+w]
break
cv2.imwrite('ROI.png', ROI)
cv2.waitKey()
【讨论】:
以上是关于OpenCV 处理 - 边缘检测和裁剪的主要内容,如果未能解决你的问题,请参考以下文章
youcans 的 OpenCV 例程200篇151. 边缘检测中的平滑处理
Opencv 笔记5 边缘处理-cannysobelLaplacianPrewitt