lich thi dau bong da.com

  • Sự đóng góp
  • Thời gian cập nhật 11/10/2021
  • 3 readings
  • Rating 0
  • great
  • Step on

Giới thiệu về lich thi dau bong da.com

truc tiep bong da so

Thuật toán khuếch tán lỗi dựa trên OpenMP

  • Sự đóng gópCá voi nhỏ
  • Cập nhật thời gian2015-09-29
  • Đọc925 lần
  • ghi bàn4
  • tuyệt vời69
  • Bước lên0

Zhang Chunliu1,2 Li Jia2 Xiong Jing2

1 (Đại học Khoa học và Công nghệ Thượng Hải, Thượng Hải 200093)

2 (Phòng thí nghiệm trọng điểm đánh giá phần mềm máy tính Thượng Hải, Thượng Hải 201112)

Thuật toán khuếch tán lỗi là một công nghệ bán sắc kỹ thuật số thường được sử dụng, nhưng thuật toán khuếch tán lỗi truyền thống là một thuật toán nối tiếp điển hình. Trên cơ sở khuếch tán lỗi truyền thống, bài báo này mô tả nguyên tắc khuếch tán điểm ảnh của khuếch tán lỗi, mô tả hai thuật toán song song của khuếch tán lỗi dựa trên độ trễ luồng và phân vùng hình ảnh, và triển khai chúng bằng OpenMP. Kết quả thực nghiệm chứng minh rằng việc song song hóa thuật toán khuếch tán lỗi là khả thi, rất hiệu quả và có triển vọng ứng dụng tốt.

Mạng Tạp chí Giáo dục http://www.jyqkw.com
Phương pháp khuếch tán lỗi từ khóa, OpenMP, lập trình song song

doi: 10.3969 / j.issn.1674-7933.2015.01.001

Thuật toán khuếch tán lỗi được OpenMP triển khai

ZHANG Chunliu1,2 LI Jia2 XIONG Lu2

1 (Đại học Khoa học và Công nghệ Thượng Hải, Thượng Hải 200093, Trung Quốc)

2 (Phòng thí nghiệm chính Thượng Hải về Đánh giá & Kiểm tra Phần mềm Máy tính, Thượng Hải 201112, Trung Quốc)

Thuật toán khuếch tán lỗi trừu tượng là một loại công nghệ phân tách kỹ thuật số được sử dụng phổ biến, tuy nhiên thuật toán khuếch tán lỗi truyền thống là một thuật toán nối tiếp điển hình. Dựa trên thuật toán khuếch tán lỗi truyền thống và theo nguyên tắc khuếch tán lỗi pixel, bài báo này mô tả hai loại song song thuật toán khuếch tán lỗi, một dựa trên độ trễ luồng và một dựa trên phân vùng hình ảnh. Cuối cùng, chúng tôi triển khai thuật toán song song bằng OpenMP. Kết quả thử nghiệm cho thấy thuật toán khuếch tán lỗi song song là khả thi, hiệu quả và xuất sắc ứng dụng tiềm năng.

Phân tán lỗi từ khóa, OpenMP, Thiết kế lập trình song song

0 Lời nói đầu

Công nghệ Halftone hay còn gọi là công nghệ sàng lọc, là một trong những công nghệ lâu đời nhất trong lĩnh vực xử lý hình ảnh[1]. Công nghệ sàng lọc lần đầu tiên bắt đầu vào cuối thế kỷ 19, khi mọi người cố gắng sử dụng thiết bị để in văn bản và hình ảnh trên giấy, công nghệ này ra đời. Đặc biệt từ khi ra đời ngành in với vai trò là mắt xích cốt lõi nhất trong quá trình in ấn luôn nhận được sự quan tâm lớn của giới học thuật và giới công nghiệp, trải qua một quá trình phát triển lâu dài. Vì mọi người coi quá trình thu được hình ảnh nhị phân từ hình ảnh thang độ xám này giống như việc thêm một màn hình vào hình ảnh gốc để xử lý, họ gọi nó là "công nghệ sàng lọc". Trong kiểu in này, bởi vì đầu ra nhị phân được sử dụng để thể hiện mức âm hình ảnh, nó còn được gọi là công nghệ bán sắc.

Một định nghĩa cụ thể hơn của Trung Quốc là công nghệ bán sắc kỹ thuật số dựa trên đặc điểm thị giác của mắt người và đặc điểm màu sắc của hình ảnh, sử dụng toán học, máy tính và các công cụ khác để tái tạo hình ảnh trên thiết bị nhị phân hoặc thiết bị nhị phân đa màu. ., Là nghiên cứu cơ bản nhằm thực hiện tái tạo tông màu ảnh với ảnh nhị phân sau khi xử lý ảnh tông màu liên tục. Công nghệ Halftone đã được áp dụng cho ngành in trong hơn một thế kỷ, và nó đã được áp dụng cho thiết bị đầu ra kỹ thuật số hơn 40 năm. Hiện nay nó đã được sử dụng rộng rãi trong in ấn, in ấn, thiết bị hiển thị và lưu trữ nén hình ảnh kỹ thuật số, truyền hình ảnh và các lĩnh vực khác.

Công nghệ bán sắc kỹ thuật số là công nghệ kết hợp với các ứng dụng máy tính để tạo ra các hiệu ứng hình ảnh thang độ xám khác nhau trên thiết bị in và hiển thị đơn sắc hoặc để tạo hiệu ứng hình ảnh màu trên thiết bị in và hiển thị màu. Kỹ thuật này chủ yếu phụ thuộc vào cách nhóm các vùng ảnh hợp lý hơn và phân phối hợp lý hơn tỷ lệ pixel đen trắng (đối với thiết bị in màn hình đơn sắc) hoặc một số tỷ lệ pixel màu trong mỗi nhóm bao gồm nhiều pixel (Đối với thiết bị in hiển thị màu) . Bởi vì những nhóm này nhỏ (thường chỉ có một vài pixel), mắt người sẽ coi chúng như một màu duy nhất là sự pha trộn của một số màu trong nhóm. Điều này giải quyết vấn đề làm thế nào để hiển thị màu 24-bit hoặc 32-bit trên thiết bị hiển thị 8-bit.

Phương pháp khuếch tán lỗi là một phương pháp chính của công nghệ bán sắc kỹ thuật số[2]. Nó được Floyd và Steinberg đề xuất lần đầu tiên vào năm 1976 và trở thành phương pháp bán sắc tốt nhất vào thời điểm đó. Sự xuất hiện của phương pháp khuếch tán lỗi là một dấu mốc quan trọng trong lịch sử công nghệ bán sắc, nó đã mang lại những thay đổi mang tính cách mạng về công nghệ và thúc đẩy sự phát triển nhanh chóng của công nghệ bán sắc. Sự phân bố của các pixel trong ảnh bán sắc sau khi xử lý khuếch tán lỗi là không đẳng hướng và không đều, vì vậy tông màu phong phú và hiệu ứng hình ảnh tốt. Cho đến ngày nay, nó vẫn được coi là một trong những thuật toán bán sắc lý tưởng nhất vì hiệu ứng hình ảnh tốt và dễ thực hiện.

Hình 1a là hình ảnh thang độ xám 8 bit và hình 1b là hình ảnh bán sắc 2 bit sau khi xử lý khuếch tán lỗi. Ở độ phân giải này, không có sự khác biệt đáng kể về chất lượng giữa hai hình ảnh, cho thấy sự tương đồng tốt.

Hình 2a và Hình 2b lần lượt phóng to chi tiết của Hình 1a và Hình 1b, lúc này chúng tôi nhận thấy sự khác biệt giữa hai hình ảnh là rất lớn, và chất lượng của hình ảnh bán sắc 2 bit ở bên phải chỉ có thể mô tả được như thô.

1 Giới thiệu về OpenMP

OpenMP là một giao diện lập trình ứng dụng được thiết kế để viết các chương trình song song trên đa xử lý[2]. Nó bao gồm một tập lệnh biên dịch, bao gồm một tập hợp các câu lệnh hướng dẫn biên dịch và một thư viện hàm. OpenMP cung cấp một phương pháp mô tả song song trừu tượng cấp độ cao, giúp giảm đáng kể độ khó và độ phức tạp của lập trình song song, để các lập trình viên có thể dành nhiều năng lượng hơn cho việc thiết kế song song của chính thuật toán, thay vì chi tiết triển khai cụ thể. Đối với lập trình đa luồng dựa trên sự đa dạng dữ liệu, OpenMP là một lựa chọn tốt.

Đồng thời, việc sử dụng OpenMP cũng mang lại tính linh hoạt cao hơn và có thể dễ dàng thích ứng với các cấu hình hệ thống song song khác nhau. Mức độ chi tiết của luồng và cân bằng tải là những vấn đề khó khăn trong lập trình đa luồng truyền thống, nhưng trong OpenMP, thư viện OpenMP tiếp quản một phần hai khía cạnh công việc này từ các lập trình viên. OpenMP có thể hoạt động bằng cách kết hợp với Fortran, C và C ++ tiêu chuẩn. Nó hỗ trợ hiệu quả cho các tác vụ như đồng bộ hóa các biến chia sẻ và phân phối tải. Nó có các đặc điểm phát triển đơn giản, phổ biến và nhanh chóng.

OpenMP là một phần mở rộng của ngôn ngữ C, mục đích chính của nó là hỗ trợ lập trình song song[3]. Mã chương trình của OpenMP tương tự như chương trình ngôn ngữ C, ngoại trừ các câu lệnh biên dịch và hướng dẫn OpenMP được thêm vào chương trình C. Các câu lệnh biên dịch và hướng dẫn này mô tả cách thức mà chương trình nên được song song hóa. Các chương trình C được thêm với OpenMP có thể được biên dịch bởi bất kỳ trình biên dịch nào hỗ trợ OpenMP và có thể được thực thi trên phần cứng của các nền tảng khác nhau. Câu lệnh hướng dẫn biên dịch OpenMP bắt đầu bằng #pragma, theo sau là omp, tên hoặc mệnh đề và kết thúc bằng một dòng mới. Một số mệnh đề có thể xuất hiện trong các lệnh khác nhau, nhưng chúng cần được định nghĩa riêng biệt. Một số lệnh có thể hoạt động trên toàn bộ khối cấu trúc và cấu trúc bao gồm câu lệnh hướng dẫn đã biên dịch và khối cấu trúc theo sau nó.

Trong C / C ++, định dạng lệnh OpenMP là lệnh #pragmaomp[clause [clause]…]. Hướng dẫn biên dịch OpenMP bao gồm các danh mục sau:

1) Cấu trúc miền song song

Mã trong cấu trúc miền song song sẽ được thực thi bởi tất cả các luồng, hãy sử dụng #pragma omp song song[clause[clause]…]Các mệnh đề thường được sử dụng bao gồm riêng tư đầu tiên, riêng tư cuối cùng, nếu, giảm thiểu, riêng tư, v.v.

2) Cấu trúc nhiệm vụ được chia sẻ

Việc phân chia mã trong cấu trúc tác vụ được chia sẻ sẽ được phân phối cho từng thành viên của nhóm luồng để thực thi, được chia thành ba trường hợp: song song cho vòng lặp, các phần song song và thực thi nối tiếp.

Định dạng vòng lặp song song for là #pragma omp for[clause[[,]mệnh đề]…]thường được sử dụng trước vòng lặp for để phân phối vòng lặp cho nhiều luồng để thực hiện song song.

Câu lệnh hướng dẫn biên dịch các phần có thể phân bổ mã trong đó cho mỗi luồng, để các phần khác nhau được thực thi bởi các luồng khác nhau. Sự khác biệt với câu lệnh for là nếu câu lệnh for được sử dụng để thực thi mã song song, tác vụ sẽ được hệ thống tự động phân bổ. nhiệm vụ phụ thuộc vào người lập trình. Việc chia sẻ tác vụ của các luồng được thực hiện và hiệu suất thực thi hoàn toàn phụ thuộc vào chính chương trình.

Câu lệnh hướng dẫn biên dịch đơn có thể được sử dụng khi một phần của mã không thể được song song hóa. Câu lệnh đơn chỉ ra cho trình biên dịch rằng phần này của mã chỉ có thể được thực thi bởi một luồng trong nhóm luồng. Định dạng là

#pragma omp single[clause[[,]mệnh đề]…]

Các luồng khác trong nhóm luồng không thực hiện câu lệnh đơn sẽ đợi kết thúc khối mã, ngoại trừ mã được khai báo với câu lệnh mệnh đề nowait.

3) Kết hợp các tác vụ được chia sẻ song song

Các tác vụ được chia sẻ song song kết hợp có thể được chia thành các đối tượng song song cho và song song. Định dạng của song song đối với là #pragma omp song song đối với[clause…]

Nó cho thấy rằng một miền song song chứa một câu lệnh for độc lập.

Định dạng của các phần song song là

#pragma omp phần song song[clause...]Nó chỉ ra rằng một miền song song chứa một câu lệnh phần duy nhất.

Nói chung, vì việc sử dụng lệnh song song có nghĩa là yêu cầu nhiều hơn một luồng, nhóm luồng cần được thiết lập trước khi sử dụng lệnh

4) Cấu trúc đồng bộ hóa

Các câu lệnh hướng dẫn biên dịch trong cấu trúc đồng bộ hóa bao gồm nguyên tử, rào cản, chính, có thứ tự, luồng riêng, v.v.

Câu lệnh hướng dẫn biên dịch OpenMP có thể chứa các mệnh đề khi cần thiết. Không có ràng buộc nào khác, các mệnh đề có thể bị xáo trộn hoặc được chọn tùy ý.

#pragma omp song song cho[clause…]Đây là câu lệnh hướng dẫn biên dịch được sử dụng thường xuyên nhất. Các mệnh đề có thể được sử dụng cùng nhau bao gồm firstprivate, if, lastprivate, private, Reduce, Schedule, v.v.

Mệnh đề firstprivate chỉ định rằng mỗi luồng có một bản sao riêng của các biến riêng của nó và các biến cần kế thừa các giá trị ban đầu trong luồng chính; mệnh đề lastprivate chỉ định rằng các giá trị biến private trong luồng cần được sao chép sang các biến tương ứng trong luồng chính sau khi quá trình xử lý song song kết thúc; Điều khoản riêng chỉ định rằng mỗi luồng có bản sao riêng của các biến; mệnh đề rút gọn chỉ định rằng một hoặc nhiều biến là riêng tư và các hoạt động được chỉ định mà các biến này cần thực hiện sau khi quá trình xử lý song song kết thúc; mệnh đề lịch trình chỉ định cách lập lịch trình lặp lại vòng lặp của câu lệnh for.

2 Thuật toán nối tiếp về sự khuếch tán lỗi

Quá trình thực thi của thuật toán khuếch tán lỗi được chia thành ba phần:

1) Tính giá trị đầu ra theo giá trị đầu vào pixel hiện tại đã cho.

Bước này thường đạt được bằng cách định lượng.Đối với mẫu thang độ xám 8 bit, hãy đặt hình ảnh vào[0,127]Giá trị pixel trong phạm vi được lượng tử hóa thành 0 và sẽ ở[128,255]Các pixel trong phạm vi được lượng tử hóa thành 1.

2) Sau khi giá trị đầu ra được tính toán, hãy tính sai số giữa giá trị hiển thị trên thiết bị đầu ra và giá trị hiển thị thực tế.

Khi đầu ra là 0, giá trị pixel tương ứng là 0, khi đầu ra là 1, giá trị pixel tương ứng là 255. Ví dụ: giả sử giá trị pixel đầu vào hiện tại là 168. Vì 168 lớn hơn 128 nên đầu ra của nó là 1 và giá trị pixel tương ứng là 255. Lỗi nằm giữa giá trị sẽ được hiển thị (128) và giá trị cuối cùng được hiển thị (255) Kém, đó là -87.

3) Phân phối lỗi cho các pixel liền kề trong khu vực, như thể hiện trong Hình 3.

Quy trình giải thuật nối tiếp của sự khuếch tán lỗi như sau:

cho (i = 0; i

for (j = 0; j

if (InputImage[i][j] <128)

OutputImage[i][j] = 0;

khác

OutputImage[i][j] = 1;

// Tính giá trị lỗi

int err = InputImage[i][j]-255 * Hình ảnh đầu ra[i][j];

// Lỗi khuếch tán

InputImage[i][j+1]+ = err * 7/16;

InputImage[i+1][j-1]+ = err * 3/16;

InputImage[i+1][j]+ = err * 5/16;

InputImage[i+1][j+1]+ = err * 1/16;

3 Song song hóa thuật toán khuếch tán lỗi

Thuật toán khuếch tán lỗi dường như là một thuật toán nối tiếp điển hình, bởi vì để tính toán pixel tiếp theo, giá trị lỗi của pixel trước đó phải được biết. Nhưng nếu chúng ta xem xét thuật toán khuếch tán lỗi từ góc độ nhận pixel, khi pixel (i, j) được xử lý, chỉ (i-1, j-1), (i-1, j), (i -1, j + 1) và (i, j-1) đã được xử lý. Như hình 4.

Hai thuật toán song song để khuếch tán lỗi được giới thiệu dưới đây:

Thuật toán 1: Phương pháp này được thực hiện bằng cách sử dụng độ trễ luồng. Theo lý thuyết trên, trước khi bắt đầu xử lý một pixel, bạn chỉ cần xử lý ba giá trị lỗi ở hàng trước và giá trị lỗi pixel ở hàng hiện tại ngay bên trái. Do đó, chúng ta có thể xác định sơ đồ triển khai theo trình tự xử lý này: mỗi luồng xử lý một hàng dữ liệu, miễn là một vài pixel đầu tiên trong hàng trước đó đã được xử lý, thì luồng chịu trách nhiệm xử lý hàng dữ liệu tiếp theo có thể bắt đầu. chấp hành. Nghĩa là, các hàng khác nhau được gán cho các luồng khác nhau để xử lý và mỗi luồng có độ trễ nhỏ khi nó bắt đầu, vì dữ liệu lỗi trong hàng trước đó cần được sử dụng khi xử lý hàng hiện tại.

Thuật toán 2: Phương pháp này sử dụng phép phân chia hình ảnh để đạt được[4]. Khi tính điểm (i, j), như trong Hình 6, miễn là hàng thứ i trước điểm (i, j) và các điểm trên đường xiên từ cột 2j + 1 đến điểm (i, j ) được xử lý, bạn có thể Xử lý điểm (i, j). Do đó, chúng ta có thể chia hình ảnh, như trong Hình 7, để mỗi luồng xử lý một dải hình ảnh và giữ cùng một nhịp điệu, để thuật toán khuếch tán lỗi có thể được song song hóa. Như trong Hình 8.

Trong phần này, chúng ta sẽ thực hiện thuật toán song song khuếch tán lỗi thông qua chương trình, thuật toán đề cập đến thuật toán song song đã được mô tả trước đây.

Chương trình trong bài viết này được thực hiện trong Visual Studio .Net 2005 và được viết bằng ngôn ngữ C ++. Visual Studio.Net 2005 hiện tại hỗ trợ đầy đủ tiêu chuẩn OpenMP 2.0, việc biên dịch và liên kết các chương trình OpenMP có thể được hỗ trợ thông qua tùy chọn trình biên dịch mới / openmp. Đầu vào của đồ họa sử dụng lớp CImage, nhưng vì lớp CImage không hỗ trợ xử lý đa luồng, chúng tôi xử lý CImage thành một mảng hai chiều:

BYTE InputImage[row][col], Xử lý song song được thực hiện trong InputImage.

Chương trình song song được thực hiện như sau:

int cpunum = omp_get_num_procs (); // Số lượng CPU, tức là số luồng

#pragma omp song song private (row, col) // Miền song song

int threadid = omp_get_thread_num (); // Số luồng của mỗi luồng

Sleep (20 * threadid); // Độ trễ ngắn theo chuỗi

#pragma omp

cho (i = 0; i <(Chiều cao / cpunum); i ++)

row = row * cpunum + threadid; // phân bổ nhiệm vụ

for (col = 0; col

// Thuật toán nối tiếp khuếch tán lỗi giống nhau

Chương trình trong bài viết này được chạy dưới bộ vi xử lý Intel Xeon Quad-Core 2.0GHz. Chúng tôi đã thực hiện chương trình nối tiếp khuếch tán lỗi và chương trình song song khuếch tán lỗi trong cùng một môi trường. Kết quả hoạt động của nó được thể hiện trong Bảng 1.

Từ kết quả phân tích mức tiêu thụ thời gian và tốc độ của thuật toán trong Hình 9 và Hình 10, chúng ta có thể thấy rằng việc song song hóa thuật toán khuếch tán lỗi là có thể đạt được và hiệu quả. Nếu nó có thể được sử dụng trên một số thiết bị in chậm, nó có thể được được cải thiện rất nhiều. tăng tốc. Nhưng vẫn còn một số vấn đề với song song hóa. Ví dụ, về đồng hồ thống nhất, nếu không có chuỗi đồng hồ thống nhất, các luồng tiếp theo có thể nhanh hơn các luồng trước, và thuật toán song song sẽ thất bại.

4. Kết luận

Bài báo này thực hiện một thuật toán khuếch tán lỗi song song dựa trên OpenMP. Theo kết quả so sánh thực nghiệm, phương pháp này có tốc độ tăng đáng kể so với các thuật toán khuếch tán lỗi nối tiếp và có lợi thế về tiêu thụ thời gian rõ ràng. Trong tương lai, các thuật toán khuếch tán lỗi dựa trên song song hóa có thể được sử dụng rộng rãi trong lĩnh vực xử lý đồ họa.

Mạng Tạp chí Giáo dục http://www.jyqkw.com
người giới thiệu

Cai Jing, Liu Xiaodan. Tổng quan về Nghiên cứu về các thuật toán khuếch tán lỗi Halftone[J]Tạp chí Đại học Quốc gia Đại Liên, 2007, 40 (5): 20-26.

Ye Yufen, Guo Baolong, Ma Jia. Thuật toán bán sắc khuếch tán lỗi dựa trên sự khác biệt trực quan[J]Kỹ thuật máy tính, 2006, 32 (16): 195-197.

Cai Jiajia, Li Mingshi, Zheng Feng. Tính toán song song của máy vi tính đa lõi dựa trên OpenMP[J]Công nghệ và Phát triển Máy tính, 2007, 17 (10): 87-91.

Panagiotis TM Chia tách kỹ thuật số song song bằng cách khuếch tán lỗi[J]Sê-ri Kỷ yếu Hội nghị Quốc tế ACM, 2003, 41: 35-41.

Trước: Công ty TNHH phần mềm Baosight Thượng Hải
Kế tiếp: Áp dụng Phân tích Chi phí Dựa trên Định phí Dựa trên Hoạt động trong các Doanh nghiệp Logistics Trunk

Chúc các bạn đọc tin lich thi dau bong da.com vui vẻ!