去除图片黑色边框及折角部分的黑色边框(彩色图像和灰度图像均可)
2018-03-01 13:58
519 查看
图片处理:去除图片周围的黑色边框及折角产生的边框
程序效果如下:
原图:
去除黑色边框后(1.png):
去除折角产生的黑色边框(2.png):
/************************************************************************/ /* 消除图片四周的黑色边框 */ /************************************************************************/ void RemoveBlackBorder(Mat &iplImg, Mat &dstImg) { int width = iplImg.size().width; int height = iplImg.size().height; int a = 0, b = 0, c = 0, d = 0; int i = 0, j = 0; if (iplImg.channels() == 1) //灰度图片 { //消除黑色边框:上 for (j = 0; j<height; j++) { bool flag = false; for (i = 0; i<width; i++) { if (iplImg.at<uchar>(j, i)<30) { ; } else { flag = true; a = j; break; } } if (flag) break; } //消除黑色边框:下 for (j = height - 1; j >= a; j--) { bool flag = false; for (i = 0; i<width; i++) { if (iplImg.at<uchar>(j, i)<30) { ; } else { flag = true; b = j; break; } } if (flag) break; } //消除黑色边框:左 for (i = 0; i<width; i++) { bool flag = false; for (j = 0; j<height; j++) { if (iplImg.at<uchar>(j, i)<30) { ; } else { flag = true; c = i; break; } } if (flag) break; } //消除黑色边框:右 for (i = width - 1; i >= c; i--) { bool flag = false; for (j = 0; j<height; j++) { if (iplImg.at<uchar>(j, i)<30) { ; } else { flag = true; d = i; break; } } if (flag) break; } } else if (iplImg.channels() == 3) //彩色图片 { //消除黑色边框:上 for (j = 0; j < height; j++) { bool flag = false; for (i = 0; i < width; i++) { int tmpb, tmpg, tmpr; tmpb = cvGet2D(&(IplImage)iplImg, j, i).val[0]; tmpg = cvGet2D(&(IplImage)iplImg, j, i).val[1]; tmpr = cvGet2D(&(IplImage)iplImg, j, i).val[2]; if (tmpb <= 30 && tmpg <= 30 && tmpr <= 30) { ; } else { flag = true; a = j; break; } } if (flag) break; } //printf("上 a: %d\n", a); //消除黑色边框:下 for (j = height - 1; j >= a; j--) { bool flag = false; for (i = 0; i < width; i++) { int tmpb, tmpg, tmpr; tmpb = cvGet2D(&(IplImage)iplImg, j, i).val[0]; tmpg = cvGet2D(&(IplImage)iplImg, j, i).val[1]; tmpr = cvGet2D(&(IplImage)iplImg, j, i).val[2]; if (tmpb <= 30 && tmpg <= 30 && tmpr <= 30) { ; } else { flag = true; b = j; break; } } if (flag) break; } //printf("下 b: %d\n", b); //消除黑色边框:左 for (i = 0; i < width; i++) { bool flag = false; for (j = 0; j < height; j++) { int tmpb, tmpg, tmpr; tmpb = cvGet2D(&(IplImage)iplImg, j, i).val[0]; tmpg = cvGet2D(&(IplImage)iplImg, j, i).val[1]; tmpr = cvGet2D(&(IplImage)iplImg, j, i).val[2]; if (tmpb <= 30 && tmpg <= 30 && tmpr <= 30) { ; } else { flag = true; c = i; break; } } if (flag) break; } //printf("左 c: %d\n", c); //消除黑色边框:右 for (i = width - 1; i >= c; i--) { bool flag = false; for (j = 0; j < height; j++) { int tmpb, tmpg, tmpr; tmpb = cvGet2D(&(IplImage)iplImg, j, i).val[0]; tmpg = cvGet2D(&(IplImage)iplImg, j, i).val[1]; tmpr = cvGet2D(&(IplImage)iplImg, j, i).val[2]; if (tmpb <= 30 && tmpg <= 30 && tmpr <= 30) { ; } else { flag = true; d = i; break; } } if (flag) break; } //printf("右 d: %d\n", d); } //复制图像 int w = d - c + 1, h = b - a + 1; dstImg = Mat(iplImg, Rect(c, a, w, h)); return; } /************************************************************************/ /* 消除图片四周的黑色边角区域 */ /************************************************************************/ Mat RemoveBlackCorner(Mat img) { int i, j; int h = img.size().height; int w = img.size().width; if (img.channels() == 1) //灰度图片 { for (j = 0; j<h; j++) { for (i = 0; i<w; i++) { if (img.at<uchar>(j, i)<30) { img.at<uchar>(j, i) = 255; } else { break; } } for (i = w - 1; i >= 0; i--) { if (img.at<uchar>(j, i)<30) { img.at<uchar>(j, i) = 255; } else { break; } } } for (i = 0; i<w; i++) { for (j = 0; j<h; j++) { if (img.at<uchar>(j, i)<30) { img.at<uchar>(j, i) = 255; } else { break; } } for (j = h - 1; j >= 0; j--) { if (img.at<uchar>(j, i)<30) { img.at<uchar>(j, i) = 255; } else { break; } } } } else if (img.channels() == 3) //彩色图片 { for (j = 0; j<h; j++) { for (i = 0; i<w; i++) { int tmpb, tmpg, tmpr; tmpb = cvGet2D(&(IplImage)img, j, i).val[0]; tmpg = cvGet2D(&(IplImage)img, j, i).val[1]; tmpr = cvGet2D(&(IplImage)img, j, i).val[2]; if (tmpb <= 30 && tmpg <= 30 && tmpr <= 30) { cvSet2D(&(IplImage)img, j, i, CvScalar(255, 255, 255, 0)); } else { break; } } for (i = w - 1; i >= 0; i--) { int tmpb, tmpg, tmpr; tmpb = cvGet2D(&(IplImage)img, j, i).val[0]; tmpg = cvGet2D(&(IplImage)img, j, i).val[1]; tmpr = cvGet2D(&(IplImage)img, j, i).val[2]; if (tmpb <= 30 && tmpg <= 30 && tmpr <= 30) { cvSet2D(&(IplImage)img, j, i, CvScalar(255, 255, 255, 0)); } else { break; } } } for (i = 0; i<w; i++) { for (j = 0; j<h; j++) { int tmpb, tmpg, tmpr; tmpb = cvGet2D(&(IplImage)img, j, i).val[0]; tmpg = cvGet2D(&(IplImage)img, j, i).val[1]; tmpr = cvGet2D(&(IplImage)img, j, i).val[2]; if (tmpb <= 30 && tmpg <= 30 && tmpr <= 30) { cvSet2D(&(IplImage)img, j, i, CvScalar(255, 255, 255, 0)); } else { break; } } for (j = h - 1; j >= 0; j--) { int tmpb, tmpg, tmpr; tmpb = cvGet2D(&(IplImage)img, j, i).val[0]; tmpg = cvGet2D(&(IplImage)img, j, i).val[1]; tmpr = cvGet2D(&(IplImage)img, j, i).val[2]; if (tmpb <= 30 && tmpg <= 30 && tmpr <= 30) { cvSet2D(&(IplImage)img, j, i, CvScalar(255, 255, 255, 0)); } else { break; } } } } return img; } int main() { Mat iplImg = imread("ori.jpg", CV_LOAD_IMAGE_ANYCOLOR | CV_LOAD_IMAGE_ANYDEPTH); Mat img; RemoveBlackBorder(iplImg, img); imwrite("1.png", img); img = RemoveBlackCorner(img); imwrite("2.png", img); cout << "OK" << endl; getchar(); return 0; }
程序效果如下:
原图:
去除黑色边框后(1.png):
去除折角产生的黑色边框(2.png):
相关文章推荐
- 让网页图片变灰色将彩色图像变成灰度的三种方法
- canvas 将彩色图片变成灰度图片
- 灰度图像和彩色图像互相转换
- 【Android】显示彩色转灰度图片
- 24位真彩色转换为8位灰度图片(完整代码)
- atitit.验证码识别step3----去除边框---- 图像处理类库 attilax总结java版本
- c# winform 把彩色图片转换为灰色的图片,变灰,灰度图片,速度很快,safe,unsafe
- VC 6.0 MFC 读取并显示图片和彩色转灰度
- OpenCv图像叠加时png图片的透明部分无法透明的解决办法
- 彩色图像转灰度图像
- ImagesUtil java图片操作 缩放图像、切割图像、图像类型转换、彩色转黑白、文字水印、图片水印等
- html 去除图像的边框
- opencv彩色图像与灰度图像叠加
- iOS之去除navigation bar下面的黑色边框
- 灰度图像转换为彩色
- 图片在ie浏览器中显示黑色边框解决
- MATLAB图像处理:一分钟去除图片中的雾霾
- JAVA实现彩色图像转黑白(灰度)
- 本图片处理类功能非常之强大可以实现几乎所有WEB开发中对图像的处理功能都集成了,包括有缩放图像、切割图像、图像类型转换、彩色转黑白、文字水印、图片水印等功能
- iOS常用小功能(获得屏幕图像、压缩图片、加边框、调整label的size)