opencv c++提取后的麻将灰度图需要进行滤波处理和二次分割得到单个麻将,即分割出一个个有完整图案的单麻将。
时间: 2024-11-25 21:15:16 浏览: 4
C++ - Qt - opencv - 图像分割 - 种子提取 - 特征提取
5星 · 资源好评率100%
在 OpenCV 中,提取麻将图片并进行预处理通常涉及以下几个步骤:
1. **灰度化**:首先将彩色图像转换为灰度图像,因为麻将的颜色对比度对后续处理很重要,而灰度处理可以减少颜色信息带来的复杂性。可以使用 `cv::cvtColor` 函数,传入 `COLOR_BGR2GRAY` 参数。
```cpp
Mat gray_image;
cv::cvtColor(image, gray_image, cv::COLOR_BGR2GRAY);
```
2. **滤波处理**:滤波是为了去除噪声、平滑图像以及增强边缘。常用的滤波器有高斯滤波器 (`cv::GaussianBlur`) 或中值滤波器 (`cv::medianBlur`)。例如:
```cpp
Mat blurred_image;
cv::GaussianBlur(gray_image, blurred_image, Size(5, 5), 0); // 使用5x5的高斯核
```
或
```cpp
cv::medianBlur(gray_image, blurred_image, 3); // 使用3x3的中值滤波窗口大小
```
3. **二值化**:为了进一步简化图像,将其转换为黑白二值图像,一般会通过阈值化处理。可以先尝试使用自适应阈值 (`cv::adaptiveThreshold`) 或全局阈值 (`cv::threshold`)。例如:
```cpp
Mat binary_image;
cv:: adaptiveThreshold(blurred_image, binary_image, 255, cv::ADAPTIVE_THRESH_GAUSSIAN_C, cv::THRESH_BINARY, 11, 2); // 自适应阈值
// 或者
cv::threshold(blurred_image, binary_image, 150, 255, cv::THRESH_BINARY); // 固定阈值
```
4. **形态学操作**:如果二值化后仍有噪声或者部分边界不清晰,可以使用形态学操作,如膨胀 (`cv::dilate`) 和腐蚀 (`cv::erode`) 来细化轮廓,或者使用开运算 (`cv::morphologyEx`, CV_MORPH_OPEN) 或闭运算 (`cv::morphologyEx`, CV_MORPH_CLOSE) 来填充空洞。
5. **边缘检测和分割**:最后可能需要应用边缘检测算法,比如 Canny 边缘检测 (`cv::Canny`),然后利用区域生长或是轮廓查找 (`cv::findContours`) 来识别和分割单独的麻将。这一步可能需要一些迭代和调整阈值,以便更好地区分不同的麻将块。
阅读全文