Skip to content

Commit 89172c0

Browse files
committed
Merge pull request opencv#9049 from Cartucho:improve_mask_tutorial_codes
2 parents a212026 + d53a521 commit 89172c0

File tree

3 files changed

+152
-103
lines changed

3 files changed

+152
-103
lines changed

samples/cpp/tutorial_code/core/mat_mask_operations/mat_mask_operations.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ static void help(char* progName)
1212
<< "This program shows how to filter images with mask: the write it yourself and the"
1313
<< "filter2d way. " << endl
1414
<< "Usage:" << endl
15-
<< progName << " [image_name -- default ../data/lena.jpg] [G -- grayscale] " << endl << endl;
15+
<< progName << " [image_path -- default ../data/lena.jpg] [G -- grayscale] " << endl << endl;
1616
}
1717

1818

@@ -45,7 +45,7 @@ int main( int argc, char* argv[])
4545
Sharpen( src, dst0 );
4646

4747
t = ((double)getTickCount() - t)/getTickFrequency();
48-
cout << "Hand written function times passed in seconds: " << t << endl;
48+
cout << "Hand written function time passed in seconds: " << t << endl;
4949

5050
imshow( "Output", dst0 );
5151
waitKey();
@@ -62,7 +62,7 @@ int main( int argc, char* argv[])
6262
filter2D( src, dst1, src.depth(), kernel );
6363
//![filter2D]
6464
t = ((double)getTickCount() - t)/getTickFrequency();
65-
cout << "Built-in filter2D time passed in seconds: " << t << endl;
65+
cout << "Built-in filter2D time passed in seconds: " << t << endl;
6666

6767
imshow( "Output", dst1 );
6868

Lines changed: 71 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -1,126 +1,132 @@
1-
import org.opencv.core.*;
1+
import org.opencv.core.Core;
2+
import org.opencv.core.CvType;
3+
import org.opencv.core.Mat;
4+
import org.opencv.core.Scalar;
25
import org.opencv.imgcodecs.Imgcodecs;
36
import org.opencv.imgproc.Imgproc;
47

58
import javax.swing.*;
6-
import java.awt.Image;
9+
import java.awt.*;
710
import java.awt.image.BufferedImage;
811
import java.awt.image.DataBufferByte;
912

1013
class MatMaskOperationsRun {
1114

12-
public void run() {
15+
public void run(String[] args) {
1316

14-
//! [laod_image]
15-
Mat I = Imgcodecs.imread("../data/lena.jpg");
16-
if(I.empty())
17-
System.out.println("Error opening image");
18-
//! [laod_image]
17+
String filename = "../data/lena.jpg";
1918

20-
Image img = toBufferedImage( I );
21-
displayImage("Input Image" , img, 0, 200 );
19+
int img_codec = Imgcodecs.IMREAD_COLOR;
20+
if (args.length != 0) {
21+
filename = args[0];
22+
if (args.length >= 2 && args[1].equals("G"))
23+
img_codec = Imgcodecs.IMREAD_GRAYSCALE;
24+
}
25+
26+
Mat src = Imgcodecs.imread(filename, img_codec);
2227

28+
if (src.empty()) {
29+
System.out.println("Can't open image [" + filename + "]");
30+
System.out.println("Program Arguments: [image_path -- default ../data/lena.jpg] [G -- grayscale]");
31+
System.exit(-1);
32+
}
33+
34+
Image img = toBufferedImage(src);
35+
displayImage("Input", img, 0, 200);
2336
double t = System.currentTimeMillis();
2437

25-
Mat J = sharpen(I, new Mat());
38+
Mat dst0 = sharpen(src, new Mat());
2639

27-
t = ((double)System.currentTimeMillis() - t)/1000;
28-
System.out.println("Hand written function times passed in seconds: " + t);
40+
t = ((double) System.currentTimeMillis() - t) / 1000;
41+
System.out.println("Hand written function time passed in seconds: " + t);
2942

30-
Image img2 = toBufferedImage( J );
31-
displayImage("Output Image" , img2, 400, 400 );
43+
Image img2 = toBufferedImage(dst0);
44+
displayImage("Output", img2, 400, 400);
3245

33-
Mat K = new Mat();
34-
//![kern]
35-
Mat kern = new Mat( 3, 3, CvType.CV_8S );
46+
//![kern]
47+
Mat kern = new Mat(3, 3, CvType.CV_8S);
3648
int row = 0, col = 0;
37-
kern.put(row ,col, 0, -1, 0, -1, 5, -1, 0, -1, 0 );
38-
//![kern]
39-
40-
System.out.println("kern = \n" + kern.dump());
49+
kern.put(row, col, 0, -1, 0, -1, 5, -1, 0, -1, 0);
50+
//![kern]
4151

4252
t = System.currentTimeMillis();
4353

44-
//![filter2D]
45-
Imgproc.filter2D(I, K, I.depth(), kern );
46-
//![filter2D]
54+
Mat dst1 = new Mat();
55+
//![filter2D]
56+
Imgproc.filter2D(src, dst1, src.depth(), kern);
57+
//![filter2D]
58+
t = ((double) System.currentTimeMillis() - t) / 1000;
59+
System.out.println("Built-in filter2D time passed in seconds: " + t);
4760

48-
t = ((double)System.currentTimeMillis() - t)/1000;
49-
System.out.println("Built-in filter2D time passed in seconds: " + t);
50-
51-
Image img3 = toBufferedImage( J );
52-
displayImage("filter2D Output Image" , img3, 800, 400 );
61+
Image img3 = toBufferedImage(dst1);
62+
displayImage("Output", img3, 800, 400);
5363
}
5464

5565
//! [basic_method]
56-
public static double saturateCastUchar(double x) {
66+
public static double saturate(double x) {
5767
return x > 255.0 ? 255.0 : (x < 0.0 ? 0.0 : x);
5868
}
5969

60-
public Mat sharpen(Mat myImage, Mat Result)
61-
{
62-
//! [8_bit]
70+
public Mat sharpen(Mat myImage, Mat Result) {
71+
//! [8_bit]
6372
myImage.convertTo(myImage, CvType.CV_8U);
64-
//! [8_bit]
73+
//! [8_bit]
6574

66-
//! [create_channels]
75+
//! [create_channels]
6776
int nChannels = myImage.channels();
68-
Result.create(myImage.size(),myImage.type());
69-
//! [create_channels]
70-
71-
//! [basic_method_loop]
72-
for(int j = 1 ; j < myImage.rows()-1; ++j)
73-
{
74-
for(int i = 1 ; i < myImage.cols()-1; ++i)
75-
{
77+
Result.create(myImage.size(), myImage.type());
78+
//! [create_channels]
79+
80+
//! [basic_method_loop]
81+
for (int j = 1; j < myImage.rows() - 1; ++j) {
82+
for (int i = 1; i < myImage.cols() - 1; ++i) {
7683
double sum[] = new double[nChannels];
7784

78-
for(int k = 0; k < nChannels; ++k) {
85+
for (int k = 0; k < nChannels; ++k) {
7986

8087
double top = -myImage.get(j - 1, i)[k];
8188
double bottom = -myImage.get(j + 1, i)[k];
8289
double center = (5 * myImage.get(j, i)[k]);
83-
double left = -myImage.get(j , i - 1)[k];
84-
double right = -myImage.get(j , i + 1)[k];
90+
double left = -myImage.get(j, i - 1)[k];
91+
double right = -myImage.get(j, i + 1)[k];
8592

86-
sum[k] = saturateCastUchar(top + bottom + center + left + right);
93+
sum[k] = saturate(top + bottom + center + left + right);
8794
}
8895

8996
Result.put(j, i, sum);
9097
}
9198
}
92-
//! [basic_method_loop]
99+
//! [basic_method_loop]
93100

94-
//! [borders]
101+
//! [borders]
95102
Result.row(0).setTo(new Scalar(0));
96-
Result.row(Result.rows()-1).setTo(new Scalar(0));
103+
Result.row(Result.rows() - 1).setTo(new Scalar(0));
97104
Result.col(0).setTo(new Scalar(0));
98-
Result.col(Result.cols()-1).setTo(new Scalar(0));
99-
//! [borders]
105+
Result.col(Result.cols() - 1).setTo(new Scalar(0));
106+
//! [borders]
100107

101108
return Result;
102109
}
103110
//! [basic_method]
104111

105112
public Image toBufferedImage(Mat m) {
106113
int type = BufferedImage.TYPE_BYTE_GRAY;
107-
if ( m.channels() > 1 ) {
114+
if (m.channels() > 1) {
108115
type = BufferedImage.TYPE_3BYTE_BGR;
109116
}
110-
int bufferSize = m.channels()*m.cols()*m.rows();
111-
byte [] b = new byte[bufferSize];
112-
m.get(0,0,b); // get all the pixels
113-
BufferedImage image = new BufferedImage(m.cols(),m.rows(), type);
117+
int bufferSize = m.channels() * m.cols() * m.rows();
118+
byte[] b = new byte[bufferSize];
119+
m.get(0, 0, b); // get all the pixels
120+
BufferedImage image = new BufferedImage(m.cols(), m.rows(), type);
114121
final byte[] targetPixels = ((DataBufferByte) image.getRaster().getDataBuffer()).getData();
115122
System.arraycopy(b, 0, targetPixels, 0, b.length);
116123
return image;
117124
}
118125

119-
public void displayImage(String title, Image img, int x, int y)
120-
{
121-
ImageIcon icon=new ImageIcon(img);
122-
JFrame frame=new JFrame(title);
123-
JLabel lbl=new JLabel(icon);
126+
public void displayImage(String title, Image img, int x, int y) {
127+
ImageIcon icon = new ImageIcon(img);
128+
JFrame frame = new JFrame(title);
129+
JLabel lbl = new JLabel(icon);
124130
frame.add(lbl);
125131
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
126132
frame.pack();
@@ -131,9 +137,9 @@ public void displayImage(String title, Image img, int x, int y)
131137

132138
public class MatMaskOperations {
133139
public static void main(String[] args) {
134-
135140
// Load the native library.
136141
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
137-
new MatMaskOperationsRun().run();
142+
143+
new MatMaskOperationsRun().run(args); // run code
138144
}
139145
}
Lines changed: 78 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,57 +1,100 @@
1+
import sys
12
import time
23
import numpy as np
34
import cv2
5+
6+
47
## [basic_method]
8+
def is_grayscale(my_image):
9+
return len(my_image.shape) < 3
10+
11+
12+
def saturated(sum_value):
13+
if sum_value > 255:
14+
sum_value = 255
15+
if sum_value < 0:
16+
sum_value = 0
17+
18+
return sum_value
19+
20+
521
def sharpen(my_image):
6-
my_image = cv2.cvtColor(my_image, cv2.CV_8U)
22+
if is_grayscale(my_image):
23+
height, width = my_image.shape
24+
else:
25+
my_image = cv2.cvtColor(my_image, cv2.CV_8U)
26+
height, width, n_channels = my_image.shape
727

8-
height, width, n_channels = my_image.shape
928
result = np.zeros(my_image.shape, my_image.dtype)
1029

1130
## [basic_method_loop]
12-
for j in range (1, height-1):
13-
for i in range (1, width-1):
14-
for k in range (0, n_channels):
15-
sum = 5 * my_image[j, i, k] - my_image[j + 1, i, k] - my_image[j - 1, i, k]\
16-
- my_image[j, i + 1, k] - my_image[j, i - 1, k];
17-
18-
if sum > 255:
19-
sum = 255
20-
if sum < 0:
21-
sum = 0
22-
23-
result[j, i, k] = sum
31+
for j in range(1, height - 1):
32+
for i in range(1, width - 1):
33+
if is_grayscale(my_image):
34+
sum_value = 5 * my_image[j, i] - my_image[j + 1, i] - my_image[j - 1, i] \
35+
- my_image[j, i + 1] - my_image[j, i - 1]
36+
result[j, i] = saturated(sum_value)
37+
else:
38+
for k in range(0, n_channels):
39+
sum_value = 5 * my_image[j, i, k] - my_image[j + 1, i, k] - my_image[j - 1, i, k] \
40+
- my_image[j, i + 1, k] - my_image[j, i - 1, k]
41+
result[j, i, k] = saturated(sum_value)
2442
## [basic_method_loop]
2543

2644
return result
2745
## [basic_method]
2846

2947

30-
I = cv2.imread("../data/lena.jpg")
31-
cv2.imshow('Input Image', I)
48+
def main(argv):
49+
filename = "../data/lena.jpg"
50+
51+
img_codec = cv2.IMREAD_COLOR
52+
if argv:
53+
filename = sys.argv[1]
54+
if len(argv) >= 2 and sys.argv[2] == "G":
55+
img_codec = cv2.IMREAD_GRAYSCALE
56+
57+
src = cv2.imread(filename, img_codec)
58+
59+
if src is None:
60+
print "Can't open image [" + filename + "]"
61+
print "Usage:\nmat_mask_operations.py [image_path -- default ../data/lena.jpg] [G -- grayscale]"
62+
return -1
63+
64+
cv2.namedWindow("Input", cv2.WINDOW_AUTOSIZE)
65+
cv2.namedWindow("Output", cv2.WINDOW_AUTOSIZE)
66+
67+
cv2.imshow("Input", src)
68+
t = round(time.time())
69+
70+
dst0 = sharpen(src)
71+
72+
t = (time.time() - t) / 1000
73+
print "Hand written function time passed in seconds: %s" % t
74+
75+
cv2.imshow("Output", dst0)
76+
cv2.waitKey()
3277

33-
t = round(time.time())
34-
J = sharpen(I)
35-
t = (time.time() - t)/1000
36-
print "Hand written function times passed in seconds: %s" % t
78+
t = time.time()
79+
## [kern]
80+
kernel = np.array([[0, -1, 0],
81+
[-1, 5, -1],
82+
[0, -1, 0]], np.float32) # kernel should be floating point type
83+
## [kern]
3784

38-
cv2.imshow('Output Image', J)
85+
## [filter2D]
86+
dst1 = cv2.filter2D(src, -1, kernel) # ddepth = -1, means destination image has depth same as input image
87+
## [filter2D]
3988

40-
t = time.time()
41-
## [kern]
42-
kernel = np.array([ [0,-1,0],
43-
[-1,5,-1],
44-
[0,-1,0] ],np.float32) # kernel should be floating point type
45-
## [kern]
89+
t = (time.time() - t) / 1000
90+
print "Built-in filter2D time passed in seconds: %s" % t
4691

47-
## [filter2D]
48-
K = cv2.filter2D(I, -1, kernel) # ddepth = -1, means destination image has depth same as input image.
49-
## [filter2D]
92+
cv2.imshow("Output", dst1)
5093

51-
t = (time.time() - t)/1000
52-
print "Built-in filter2D time passed in seconds: %s" % t
94+
cv2.waitKey(0)
95+
cv2.destroyAllWindows()
96+
return 0
5397

54-
cv2.imshow('filter2D Output Image', K)
5598

56-
cv2.waitKey(0)
57-
cv2.destroyAllWindows()
99+
if __name__ == "__main__":
100+
main(sys.argv[1:])

0 commit comments

Comments
 (0)